Машинное обучение на Swift: Core ML, Create ML, TensorFlow Swift и Turi Create

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Машинное обучение на 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 — это библиотека

Рекомендаций