Core ML Apple官方文档
在iOS平台上,可以使用Core ML来集成经过训练的机器学习模型到你的APP。
对一组训练数据应用机器学习算法会生成一个经过训练的模型,该模型会根据输入数据来进行预测。例如,根据某个地区的历史房价进行培训的模型可能能够在给定房屋的卧室和浴室数量时,预测该房屋的价格。
Core ML是框架和功能的基础, Core ML对Vision的图像分析,自然语言处理基础(例如NSLinguisticTagger类)和用于评估学习决策树的GameplayKit提供了支持。 Core ML本身建立在Accelerate和BNNS以及Metal Performance Shader的底层库之上。
获得Core ML模型
Core ML支持各种机器学习模型,包括神经网络,树组合,支持向量机和广义线性模型。 Core ML需要使用Core ML格式的模型(文件扩展名为.mlmodel的模型)。
苹果提供了几种流行的,已经是Core ML格式的开源模式。 您可以下载这些模型并开始在你的APP中使用它们。 另外,各研究组和大学发布了他们的模型和培训数据,这些数据可能不是Core ML格式的模型。 要使用这些模型,您需要转换它们,这些将在后续内容中会有具体介绍。
集成Core ML到你的APP
下面会集成一个简单的模型到APP里,然后传入数据到模型,并产出模型预测结果。
该示例应用程序使用经过训练的模型MarsHabitatPricer.mlmodel来预测火星上的栖息地价格。
添加模型到你的的Xcode项目
将模型拖放到项目导航目录中就可以将模型添加到Xcode项目里。
您可以通过打开Xcode中的模型来查看有关模型的信息(包括模型类型及其预期输入和输出)。 模型的输入数据是太阳能电池板和温室的数量,以及栖息地的面积(按英亩)。 模型的输出就是栖息地的预测价格。
在代码中创建模型
Xcode还可以使用模型根据输入、输出信息自动生成的自定义编程接口,并可在代码中与模型进行交互。 例如MarsHabitatPricer.mlmodel,Xcode生成了表示模型的(MarsHabitatPricer),模型输入(MarsHabitatPricerInput)和模型输出(MarsHabitatPricerOutput)的接口。
使用生成的MarsHabitatPricer类的初始化方法来创建模型:
letmodel =MarsHabitatPricer()
获取输入值以传递给模型
该示例使用UIPickerView从用户获取模型的输入值:
funcselectedRow(forfeature: Feature)->Int{
returnpickerView.selectedRow(inComponent: feature.rawValue)
}
letsolarPanels = pickerDataSource.value(for: selectedRow(for: .solarPanels), feature: .solarPanels)
letgreenhouses = pickerDataSource.value(for: selectedRow(for: .greenhouses), feature: .greenhouses)
letsize = pickerDataSource.value(for: selectedRow(for: .size), feature: .size)
使用模型进行预测
MarsHabitatPricer类有一个自动生成的预测方法(solarPanels:greenhouses:size :),用于根据模型的输入值预测价格-- 在当前情况下,这些输入值是指太阳能电池板的数量,温室的数量和栖息地的大小(英亩)。 该方法的结果是一个MarsHabitatPricerOutput实例marsHabitatPricerOutput。
guardletmarsHabitatPricerOutput =try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size)else{
fatalError("Unexpected runtime error.")
}
从marsHabitatPricerOutput的price属性中可以获取预测价格,并在APP的UI中显示结果。
letprice = marsHabitatPricerOutput.price
priceLabel.text = priceFormatter.string(for: price)
注意:
自动生成的预测(solarPanels:greenhouses:size :)方法可能会发生错误。 在使用Core ML时遇到的最常见的错误类型发生在你传递给该方法的输入数据类型与模型所期望的输入类型不匹配时,例如,错误格式的图像。 在该APP中,输入的类型为Double。 任何类型的不匹配在编译时被捕获,如果发生错误,示例APP会触发一个致命错误。
建立和运行Core ML APP
Xcode会将Core ML模型编译成经过优化以在设备上运行的资源。 该模型的优化已经包含在您的APP bundle中,并且表现在APP在设备上进行预测的过程中。
将训练模型转换为Core ML模型
将使用第三方机器学习工具创建的训练模型转换为Core ML模型的格式。
如果你的模型是使用已支持的第三方机器学习工具创建和训练的,则可以使用Core ML Tools将其转换为Core ML模型的格式。 表1列出了支持的型号和第三方工具。
- 注意
Core ML Tools是一个Python包(coremltools),托管在Python包索引(PyPI)上。 有关Python包的信息,请参阅Python Packaging User Guide.。
表1 Core ML Tools支持的模型和第三方工具
转换模型
使用与模型的第三方工具相对应的Core ML转换工具转换模型。 调用转换工具的convert方法并将生成的模型保存为Core ML模型的格式(.mlmodel)。
例如,如果您的模型是使用Caffe创建的,请将Caffe模型(.caffemodel)传递给coremltools.converters.caffe.convert方法。
import coremltools
coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')
然后将结果模型保存为Core ML模型格式。
coreml_model.save('my_model.mlmodel')
根据您的模型类别,您可能需要更新输入,输出和标签,或者你可能需要声明相应的名称,类型和格式。因为可用的选项因工具而异,转换工具还有很多文档。 有关Core ML Tools的更多信息,请参阅Package Documentation.
编写自定义转换工具
当您需要转换的模型不是表1所列工具支持的格式时,可以创建自己的转换工具。
编写自己的转换工具涉及到将模型的输入,输出和架构的表示转换为Core ML模型的格式。 您可以通过定义模型架构的每一层及其与其他层的连接来实现。 可以使用Core ML Tools提供的转换工具作为参照; 他们演示了如何将从第三方工具创建的各种模型类型转换为Core ML模型的格式。
- 注意
Core ML模型格式由一组暂时协议文件定义,并在Core ML Model Specification中有详细描述。