Swift用于机器学习:实践中的能力与局限
机器学习(ML)世界长期以来几乎完全与Python联系在一起——这是一种拥有丰富库生态系统的语言,如TensorFlow、PyTorch和scikit-learn。然而,随着iOS和macOS的普及,以及Apple强大框架的出现,Swift语言开始在ML领域占据一席之地。在本文中,我们将分析Swift在机器学习任务中的适用程度,它的优势所在,以及关键的限制,并提供实际代码示例。
为什么选择Swift?ML的主要优势
Swift是一种由Apple开发的编译型、静态类型语言。它在ML方面的主要优势是性能和类型安全。与解释型且可能在繁重计算中速度较慢的Python不同,Swift编译为原生代码,在相同算法上速度可提升2-5倍。此外,Swift与Apple生态系统完美集成:Core ML和Create ML允许直接在用户设备上部署模型。
关键框架
- Core ML — 用于将训练好的模型集成到iOS/macOS应用程序中的主要框架。支持来自TensorFlow、PyTorch和ONNX的模型。
- Create ML — 用于训练简单模型(图像分类、文本分类、回归)的工具,无需编写代码或只需少量Swift代码。
- Swift for TensorFlow (S4TF) — Google的实验性项目,允许用Swift编写神经网络并与TensorFlow完全集成。遗憾的是,该项目已暂停,但其理念在其他计划中得以延续。
- MLX — Apple推出的新机器学习框架,针对Apple Silicon芯片进行了优化,用于设备端机器学习。
实践示例:使用Core ML进行图像分类
让我们看一个简单的例子——加载预训练的MobileNetV2模型并进行图像分类。这段代码可在iOS和macOS上运行。
import CoreMLimport Visionimport UIKit
// 加载模型guard let model = try? VNCoreMLModel(for: MobileNetV2().model) else { fatalError("无法加载模型")}
// 创建请求let request = VNCoreMLRequest(model: model) { request, error in guard let results = request.results as? [VNClassificationObservation], let topResult = results.first else { print("无结果") return } print("最可能的类别: \\(topResult.identifier) 概率: \\(topResult.confidence)")}
// 加载图像guard let image = UIImage(named: "cat.jpg"), let ciImage = CIImage(image: image) else { fatalError("无法加载图像")}
let handler = VNImageRequestHandler(ciImage: ciImage)try? handler.perform([request])这段代码展示了如何轻松地将ML集成到原生应用程序中。一切开箱即用,无需配置环境。
使用Create ML在Swift上创建模型
Create ML允许直接在Xcode中训练模型。以下是在Swift上训练文本分类器的示例:
import CreateMLimport Foundation
// 从JSON加载数据let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "tweets.json"))
// 分割为训练集和测试集let (trainingData, testData) = data.randomSplit(by: 0.8, seed: 42)
// 创建并训练模型let classifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "sentiment")
// 评估准确率let evaluation = classifier.evaluation(on: testData)print("准确率: \\(evaluation.classificationError)")
// 保存模型let modelURL = URL(fileURLWithPath: "SentimentClassifier.mlmodel")try