Swift 机器学习:实践中的能力与局限

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift 机器学习:实践中的能力与局限

\n\n

机器学习(ML)的世界长期以来一直与 Python 紧密相连。然而,随着 iOS/macOS 开发的日益普及以及 Apple 强大框架的出现,Swift 语言正越来越积极地进入这一领域。在本文中,我们将探讨 Swift 在 ML 任务中的适用性、它提供了哪些工具、在哪些场景下使用它是合理的,以及它在哪些方面仍逊色于经典的 Python。

\n\n

为什么选择 Swift?Apple 生态系统与性能

\n\n

Swift 是一种编译型语言,具有严格的类型系统和接近 C++ 的高性能。对于机器学习来说,这带来了几个关键优势:

\n
    \n
  • 执行速度:原生计算,没有解释器的额外开销。
  • \n
  • 与 Apple 平台集成:直接访问 Metal(GPU)、Neural Engine、Accelerate 框架。
  • \n
  • 内存安全:与 Python 相比,运行时错误更少。
  • \n
\n

然而,主要的驱动力是 Apple 希望让 ML 对移动开发者更易用。iOS 开发者无需学习 Python 并单独部署模型,而是可以留在熟悉的 Xcode 环境中。

\n\n

关键框架

\n

Apple 提供了三个主要工具用于在 Swift 上进行 ML 工作:

\n
    \n
  • Core ML — 在设备上运行模型的运行时。
  • \n
  • Create ML — 无需 Python 即可训练模型的框架。
  • \n
  • MLX(Apple 开源项目)— 用于更深入的研究。
  • \n
\n\n

使用 Core ML 运行预训练模型

\n

最常见的场景是将预训练模型集成到移动应用中。Swift 在这方面表现出色:代码简洁且直观。

\n\n

使用 Core ML 和 Vision 进行图像分类的示例:

\n
import Vision\nimport CoreML\n\n// 1. 加载模型(例如 MobileNetV2)\nguard let model = try? VNCoreMLModel(for: MobileNetV2().model) else {\n    fatalError("无法加载模型")\n}\n\n// 2. 创建请求\nlet request = VNCoreMLRequest(model: model) { request, error in\n    if let results = request.results as? [VNClassificationObservation] {\n        // 输出前三个预测结果\n        for result in results.prefix(3) {\n            print("\\(result.identifier): \\(result.confidence * 100)%")\n        }\n    }\n}\n\n// 3. 对图像执行请求\nguard let image = UIImage(named: "cat.jpg"),\n      let ciImage = CIImage(image: image) else { return }\n\nlet handler = VNImageRequestHandler(ciImage: ciImage)\ntry? handler.perform([request])
\n\n

如您所见,Swift 只需 10-15 行代码即可完成推理。所有操作都是原生的,利用 GPU 或 Neural Engine。

\n\n

使用 Create ML 训练模型

\n

Create ML 是 Apple 让普通开发者也能进行模型训练的一次尝试。您可以在不离开 Swift 的情况下训练图像分类器、文本分类器、表格数据甚至推荐模型。

\n\n

示例:训练文本分类器

\n

假设我们有一个包含评论和标签(positive/negative)的 CSV 文件。训练过程如下:

\n
import CreateML\nimport Foundation\n\n// 1. 加载数据\nlet data = try MLDataTable(contentsOf: URL(fileURLWithPath: "reviews.csv"))\n\n// 2. 分割为训练集和测试集\nlet (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 42)\n\n// 3. 创建分类器\nlet classifier = try MLTextClassifier(trainingData: trainingData,\n                                      textColumn: "text",\n                                      labelColumn: "label")\n\n// 4. 评估准确率\nlet evaluation = classifier.evaluation(on: testingData)\nprint("准确率: \\(evaluation.classificationError * 100)%")\n\n// 5. 保存模型以供 Core ML 使用\ntry class                

博客

书籍推荐