Машинное обучение на Swift: библиотеки для iOS/macOS
Swift — мощный и современный язык от Apple, который всё активнее используется не только для классической разработки приложений, но и для задач машинного обучения. Благодаря тесной интеграции с экосистемой Apple, Swift позволяет запускать модели ML прямо на устройстве (iOS, macOS, watchOS, tvOS) без отправки данных на сервер. В этой статье мы разберём четыре ключевых инструмента: Core ML, Create ML, Swift for TensorFlow и Turi Create. Вы узнаете, как они работают, в чём их сильные стороны и как начать с ними работать.
1. Core ML — основа для интеграции моделей
Core ML — это фреймворк от Apple, который позволяет внедрять обученные модели машинного обучения в приложения на Swift. Он поддерживает модели из TensorFlow, PyTorch, Keras, scikit-learn и других популярных библиотек (через конвертацию в формат .mlmodel).
Основное преимущество Core ML — производительность: модели выполняются на устройстве, используя CPU, GPU или Neural Engine (на устройствах с чипом A12+). Это обеспечивает низкую задержку и приватность данных.
Пример использования Core ML в Swift:
import CoreML
import Vision
// Загружаем модель (например, MobileNetV2)
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 {
return
}
print("Распознано: \(topResult.identifier) с вероятностью \(topResult.confidence)")
}
// Выполняем запрос на изображении
let image = UIImage(named: "cat.jpg")!
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try? handler.perform([request])
2. Create ML — обучение моделей без кода (почти)
Create ML — это инструмент от Apple для обучения моделей машинного обучения с минимальным написанием кода. Он работает на macOS (через Swift Playgrounds или Xcode) и поддерживает задачи: классификация изображений, текста, табличные данные, рекомендательные системы и многое другое.
Вы можете обучить модель, просто передав ей папку с размеченными данными. После обучения модель автоматически конвертируется в формат Core ML и готова к использованию.
Пример обучения классификатора изображений на Swift:
import CreateML
import Foundation
// Путь к папке с тренировочными данными (структура: /train/class1/, /train/class2/)
let trainingData = try MLImageClassifier.DataSource.labeledDirectories(at: URL(fileURLWithPath: "/path/to/train"))
// Создаём и обучаем модель
let classifier = try MLImageClassifier(trainingData: trainingData)
// Оцениваем точность на тестовых данных
let evaluationMetrics = classifier.evaluation(on: trainingData)
print("Точность: \(evaluationMetrics.classificationError)")
// Сохраняем модель в формате .mlmodel
try classifier.write(to: URL(fileURLWithPath: "/path/to/MyImageClassifier.mlmodel"))
3. Swift for TensorFlow (S4TF) — научные эксперименты
Swift for TensorFlow — это экспериментальный проект Google, который привносит возможности TensorFlow в мир Swift. Он позволяет писать дифференцируемые вычисления и обучать нейронные сети на Swift, используя всю мощь автоматического дифференцирования.
Хотя проект официально заморожен, его идеи живут в сообществе, а код можно использовать для исследований и прототипирования. S4TF особенно полезен, если вы хотите создавать кастомные слои, функции потерь или экспериментировать с архитектурами.
Пример простой нейронной сети на Swift for TensorFlow:
import TensorFlow
// Определяем модель: полносвязная сеть с одним скрытым слоем
struct SimpleNN: Layer {
var layer1 = Dense<Float>(inputSize: 784, outputSize: 128, activation: relu)
var layer2 = Dense<Float>(inputSize: 128, outputSize: 10, activation: softmax)
@differentiable
func callAsFunction(_ input: Tensor<Float>) -> Tensor<Float> {
return input.sequenced(through: layer1, layer2)
}
}
// Создаём модель и оптимизатор
var model = SimpleNN()
let optimizer = SGD(for: model, learningRate: 0.01)
// Цикл обучения (упрощённо)
for epoch in 0..<10 {
let (loss, grad) = model.valueWithGradient { model -> Tensor<Float> in
let logits = model(features)
return softmaxCrossEntropy(logits: logits, labels: labels)
}
optimizer.update(&model, along: grad)
print("Epoch \(epoch): Loss \(loss)")
}
4. Turi Create — простые ML-решения для приложений
Turi Create — это библиотека