Swift 用于机器学习:能力与局限
机器学习(ML)世界传统上与 Python、R 和 Julia 相关联。然而,随着 Apple 生态系统的普及以及强大框架的出现,Swift 语言开始在这一领域占据一席之地。由 Apple 开发的 Swift 最初是为 iOS 和 macOS 设计的,但其性能、类型安全性和语法简洁性使其成为 ML 任务(尤其是在 Apple 设备上)的有趣候选者。在本文中,我们将探讨 Swift 在机器学习中的适用性、其优势以及开发者面临的限制。
为什么 Swift 对 ML 有用?
Swift 是一种编译型语言,与 Python 等解释型语言相比,它在执行速度上具有显著优势。这对于需要高性能的任务(例如在移动设备上进行模型推理)至关重要。此外,Swift 具有严格的类型检查,有助于在编译阶段避免一类错误,使代码更可靠、更具可预测性。与 Apple 生态系统(Core ML、Create ML、Metal)的集成允许模型直接部署在用户设备上,从而实现低延迟并保护数据隐私。
Swift 在机器学习方面的主要能力
Core ML — 旗舰框架
Core ML 是 Apple 用于将 ML 模型集成到应用程序中的主要框架。它支持多种模型类型:神经网络、决策树、集成模型等。Core ML 针对 Apple 设备(CPU、GPU、神经引擎)进行了优化,能够以最小延迟执行推理。模型通常用 Python 开发(例如在 PyTorch 或 TensorFlow 中),然后使用 coremltools 工具转换为 .mlpackage 格式。
使用 Core ML 进行图像分类的简单示例:
import CoreMLimport Vision
// Loading the modelguard let model = try? VNCoreMLModel(for: MyImageClassifier().model) else { fatalError("Error loading model")}
// Creating a requestlet request = VNCoreMLRequest(model: model) { request, error in guard let results = request.results as? [VNClassificationObservation], let topResult = results.first else { return } print("Recognized: \\(topResult.identifier) with confidence \\(topResult.confidence)")}
// Performing the request on an imagelet handler = VNImageRequestHandler(url: imageURL)try? handler.perform([request])Create ML — 无需代码(以及结合代码)的训练
Create ML 是 Apple 提供的框架和应用程序,允许在 macOS 上直接训练 ML 模型,无需深入掌握数据科学知识。您可以训练文本分类、图像分类、回归甚至推荐系统的模型。Create ML 使用 Swift 作为配置训练过程的主要语言,使其对 iOS 开发者友好。
使用 Swift 训练文本分类器的示例:
import CreateMLimport NaturalLanguage
// Creating a dataset from JSONlet data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/path/to/training.json"))
// Splitting into training and testing setslet (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 42)
// Creating and training the modellet classifier = try MLTextClassifier(trainingData: trainingData, textColumn: "text", labelColumn: "label")
// Evaluating accuracy on test datalet evaluationMetrics = classifier.evaluation(on: testingData)print("Accuracy: \\(evaluationMetrics.classificationError)")
// Saving the modellet metadata = MLModelMetadata(author: "PythonLib",