Swift 机器学习:实践中的能力与局限
\n\n机器学习(ML)的世界长期以来一直与 Python 紧密相连。然而,随着 iOS/macOS 开发的日益普及以及 Apple 强大框架的出现,Swift 语言正越来越积极地进入这一领域。在本文中,我们将探讨 Swift 在 ML 任务中的适用性、它提供了哪些工具、在哪些场景下使用它是合理的,以及它在哪些方面仍逊色于经典的 Python。
\n\n为什么选择 Swift?Apple 生态系统与性能
\n\nSwift 是一种编译型语言,具有严格的类型系统和接近 C++ 的高性能。对于机器学习来说,这带来了几个关键优势:
\n- \n
- 执行速度:原生计算,没有解释器的额外开销。 \n
- 与 Apple 平台集成:直接访问 Metal(GPU)、Neural Engine、Accelerate 框架。 \n
- 内存安全:与 Python 相比,运行时错误更少。 \n
然而,主要的驱动力是 Apple 希望让 ML 对移动开发者更易用。iOS 开发者无需学习 Python 并单独部署模型,而是可以留在熟悉的 Xcode 环境中。
\n\n关键框架
\nApple 提供了三个主要工具用于在 Swift 上进行 ML 工作:
\n- \n
- Core ML — 在设备上运行模型的运行时。 \n
- Create ML — 无需 Python 即可训练模型的框架。 \n
- MLX(Apple 开源项目)— 用于更深入的研究。 \n
使用 Core ML 运行预训练模型
\n最常见的场景是将预训练模型集成到移动应用中。Swift 在这方面表现出色:代码简洁且直观。
\n\n使用 Core ML 和 Vision 进行图像分类的示例:
\nimport 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 训练模型
\nCreate ML 是 Apple 让普通开发者也能进行模型训练的一次尝试。您可以在不离开 Swift 的情况下训练图像分类器、文本分类器、表格数据甚至推荐模型。
\n\n示例:训练文本分类器
\n假设我们有一个包含评论和标签(positive/negative)的 CSV 文件。训练过程如下:
\nimport 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