Swift 机器学习:iOS/macOS 的库和工具
Apple 生态系统开发传统上与 Swift 语言相关联。尽管 Python 仍然是数据科学领域的绝对领导者,但 Swift 正在积极追赶,提供了针对 Apple 硬件优化的原生解决方案。在本文中,我们将分析关键的库和框架,这些库和框架允许在 iOS、macOS、watchOS 和 tvOS 应用程序中引入机器学习 (ML),并直接在设备上进行模型训练。
1. Core ML — 一切的基础
Core ML 不仅仅是一个库,它是 Apple 的一个基础框架,充当在设备上执行 ML 模型的运行时。它支持在 Python(scikit-learn、TensorFlow、PyTorch)中训练并使用 Core ML Tools 转换为 .mlmodel 或 .mlpackage 格式的模型。
Core ML 的关键功能:
- 针对 Neural Engine、GPU 和 CPU 的优化(自动选择)。
- 支持图像、文本、序列、表格数据。
- 处理分类、目标检测(YOLO、SSD)、语义分割模型。
- 通过 Natural Language 支持 Transformer 模型(BERT、GPT-2)。
用于图像分类的 Core ML 模型集成示例 (Swift):
import CoreMLimport Vision
// 1. 加载模型(例如 MobileNetV2)guard let model = try? VNCoreMLModel(for: MobileNetV2(configuration: MLModelConfiguration()).model) else { fatalError("无法加载模型")}
// 2. 创建 Vision 请求let request = VNCoreMLRequest(model: model) { request, error in guard let results = request.results as? [VNClassificationObservation], let topResult = results.first else { return } print("识别结果: \\(topResult.identifier) 置信度 \\(topResult.confidence)")}
// 3. 对图像执行请求guard let image = UIImage(named: "cat.jpg"), let ciImage = CIImage(image: image) else { return }
let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])try? handler.perform([request])2. Create ML — 无代码(和有代码)训练
Create ML 是 Apple 的一个工具,内置于 Xcode 和 Swift Playgrounds 中,允许直接在 Mac 上使用 Swift 训练机器学习模型。它非常适合在不离开生态系统的情况下进行原型设计和创建自定义模型。
Create ML 支持:
- 分类和回归(表格数据)。
- 图像分类和目标检测。
- 文本分析(情感分析、分类)。
- 推荐系统(基于用户行为)。
- 声音分类。
在 Swift (macOS) 上训练文本分类器的示例:
import CreateMLimport Foundation
// 1. 从 CSV 加载数据let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/Users/me/emails.csv"))
// 2. 分割为训练/测试集let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 42)
// 3. 训练情感分类器let sentimentClassifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "label")
// 4. 评估准确率let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)print("准确率: \\(evaluationMetrics.classificationError)")
// 5. 保存模型let metadata = MLModelMetadata(author: "PythonLib", shortDescription: "邮件情感分类器", version: "1.0")try sentimentClassifier.write(to: URL(fileURLW