Swift 机器学习:实践中的优势与局限

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

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

开始课程

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

博客

书籍推荐