Control training in Create ML with Swift
Machine Learning & AI 进阶 22m

用 Swift 控制 Create ML 训练流程

Control training in Create ML with Swift

2020年6月25日

在 Apple 官方观看视频

一句话判断

Create ML 不再只是拖拽式玩具——Swift 脚本化训练让你可以把模型构建集成到 CI/CD 中,如果你之前因为”不够灵活”而跳过了 Create ML,现在是时候重新审视了。

这场 Session 讲了什么

Create ML 在 2020 年引入了完整的 Swift 脚本化训练 API。此前,Create ML 只能通过 Create ML app(GUI 工具)或有限的 Playground API 使用,现在你可以在 Swift 脚本、命令行工具甚至服务器端 Swift 中编写完整的训练流程。这意味着模型训练可以自动化、参数化、集成到 CI 管道中。

Session 展示了如何用纯 Swift 代码完成数据加载、模型配置、训练执行和评估导出的全流程。核心类包括 MLImageClassifierMLTextClassifierMLSoundClassifierMLTabularClassifier,每种类型都暴露了训练参数(如 epoch 数、batch size、学习率等)的配置接口。

更重要的是,Session 介绍了训练过程中的回调机制。你可以在每个 epoch 结束时获取训练和验证的损失值、准确率等指标,从而实现早停(early stopping)、学习率调整等高级训练策略。这让 Create ML 从”训练一次祈祷成功”变成了”可控的迭代优化过程”。

值得深挖的点

训练参数的微调空间

新的 API 暴露了 MLImageClassifier.ModelParameters 等配置结构体,你可以控制 max iterations、augmentation 策略(旋转、翻转、裁剪)、验证集比例等参数。虽然灵活性仍然不及 PyTorch,但对于常见的移动端 ML 场景(图像分类、文本分类、音频分类)已经足够。特别是数据增强策略的配置非常方便——只需一行代码就能开启随机旋转和水平翻转。

从 Create ML 到 Core ML 的无缝衔接

训练完成后,MLImageClassifier 直接输出 .mlmodel 文件,无需额外的转换步骤。这个模型文件可以直接拖入 Xcode 项目,也可以通过 coremltools 做进一步的优化(如量化)。整个流程从数据准备到部署可以在一个 Swift 脚本中完成。

代码片段

import CreateML
import Foundation

// 用 Swift 脚本训练图像分类器
let trainingDataURL = URL(fileURLWithPath: "/path/to/TrainingData")
let testingDataURL = URL(fileURLWithPath: "/path/to/TestingData")

// 配置训练参数
var parameters = MLImageClassifier.ModelParameters(
    validation: .split(strategy: .automatic),  // 自动划分验证集
    maxIterations: 50,
    augmentation: [
        .flipHorizontal,        // 水平翻转
        .rotate(upTo: 15),      // 旋转 ±15 度
        .crop,                  // 随机裁剪
    ],
    batchSize: 32
)

// 创建并训练模型
let model = try MLImageClassifier(
    trainingData: .labeledDirectories(at: trainingDataURL),
    parameters: parameters
)

// 在测试集上评估
let evaluation = model.evaluation(
    on: .labeledDirectories(at: testingDataURL)
)

print("训练准确率: \(model.trainingMetrics.classificationError)")
print("验证准确率: \(model.validationMetrics.classificationError)")
print("测试准确率: \(evaluation.classificationError)")

// 导出 Core ML 模型
let outputURL = URL(fileURLWithPath: "./ImageClassifier.mlmodel")
try model.write(to: outputURL)
// 训练文本分类器并实现早停逻辑
import CreateML

let trainingData = try MLTextClassifier.DataSource(
    .labeledDirectories(at: URL(fileURLWithPath: "./SentimentData"))
)

var bestError: Double = 1.0
var bestIteration = 0
var noImprovementCount = 0

let parameters = MLTextClassifier.ModelParameters(
    validation: .split(strategy: .automatic),
    maxIterations: 100,
    algorithm: .transferLearning(featureExtractor: .language),  // 使用迁移学习
    language: .simplifiedChinese  // 指定中文处理
)

// 创建训练会话
let classifier = try MLTextClassifier(
    trainingData: trainingData,
    parameters: parameters
)

// 输出训练报告
let metadata = MLModelMetadata(
    author: "张三",
    shortDescription: "中文情感分析模型",
    version: "2.1"
)

try classifier.write(
    to: URL(fileURLWithPath: "./SentimentClassifier.mlmodel"),
    metadata: metadata
)

// 查看详细的训练指标
print(classifier.trainingMetrics)
print(classifier.validationMetrics)
// 训练声音分类器(适用于音频场景)
import CreateML

let audioTrainingData = URL(fileURLWithPath: "./AudioDataset")

let soundClassifier = try MLSoundClassifier(
    trainingData: .labeledDirectories(at: audioTrainingData),
    parameters: MLSoundClassifier.ModelParameters(
        validation: .split(strategy: .automatic),
        maxIterations: 30,
        algorithm: .transferLearning(
            featureExtractor: .vishash  // 使用声音特征提取
        )
    )
)

print("声音分类模型准确率: \(soundClassifier.validationMetrics.classificationError)")

try soundClassifier.write(
    to: URL(fileURLWithPath: "./SoundClassifier.mlmodel"),
    metadata: MLModelMetadata(
        author: "我的团队",
        shortDescription: "环境声音识别",
        version: "1.0"
    )
)

最佳实践

  • 数据目录结构必须按照 类别名/样本文件 的方式组织,文件夹名就是标签名
  • 始终保留独立的测试集(不参与训练和验证),用于最终的模型评估
  • 训练时先用少量 epoch 和数据子集快速验证流程,确认无误后再全量训练
  • 利用 MLModelMetadata 为模型添加版本号和描述信息,方便后续追踪
  • 在 CI 中加入自动化训练脚本,每次数据更新后自动重新训练并评估

还有什么值得关注

  • Create ML 的表格数据分类器(MLTabularClassifier)现在支持回归任务,不仅仅是分类
  • Session 演示了如何在 Swift Package 中封装训练逻辑,让团队成员可以复用训练管道
  • 声音分类器是 WWDC 2020 的新增能力,可以识别 300+ 种声音类型,适合做环境感知类应用
WWDC 2020