向应⽤中添加一个简单的模型,然后向模型中传入输入数据,并对模型的预测值进行处理。
在官方文档中找到位置进行实例程序下载。
概述
本⽰例应⽤使用了一个已训练模型 MarsHabitatPricer.mlmodel,⽤以预测火星上的殖民地价值。
将模型添加到 Xcode 项⽬目中
要想将模型添加到 Xcode 项⽬当中,只需要将模型拖曳进项目导航器 (project navigator) 当中即可。
您可以通过在 Xcode 中打开这个模型,从而来查看它的相关信息,其中包括有模型类型以及其预期输入和输出。模型的输入为太阳能板和温室的数量,以及殖民地的规模⼤小(以英亩为单位)。模型的输出则是对这个殖⺠地价值的预测。
⽤代码创建模型
Xcode 同样也会使用模型的输入输出信息,来自动为模型生成一个自定义的编程接口,从⽽就可以在代码当中与模型进⾏交互。对于这个 MarsHabitatPricer.mlmodel ⽽言,Xcode 会⽣成相应的接口,来分别表⽰模型本⾝(MarsHabitatPricer)、模型输入 (MarsHabitatPricerInput)以及模型输出 (MarsHabitatPricerOutput)。
使⽤所生成的 MarsHabitatPricer 类的构造器,便可以创建这个模型:
let model = MarsHabitatPricer()
获取输入值以传递给模型
⽰例应用使用了 UIPickerView,以便从⽤户那⾥获取模型的输入值。
func selectedRow(for feature: Feature) -> Int {
return pickerView.selectedRow(inComponent: feature.rawValue)
}
let solarPanels = pickerDataSource.value(for: selectedRow(for: .solarPanels), feature: .solarPanels)
let greenhouses = pickerDataSource.value(for: selectedRow(for: .greenhouses), feature: .greenhouses)
let size = pickerDataSource.value(for: selectedRow(for: .size), feature: .size)
使用模型来进行预测
MarsHabitatPricer 类会⽣成一个名为 prediction(solarPanels:greenhouses:size:) 方法,从⽽就可以根据模型的输入值来预测价值,在本例当中,输入值为太阳能板的数量、温室的数量以及殖⺠地的规模⼤小(以英亩为单位)。这个方法的结果为一个 MarsHabitatPricerOutput 实例,这⾥我们将其取名为 marsHabitatPricerOutput。
guard let marsHabitatPricerOutput = try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size) else {
fatalError("Unexpected runtime error.")
}
通过读取 marsHabitatPricerOutput 的 price 属性,就可以获取所预测的价值,然后就可以在应用的UI当中对这个结果进⾏展⽰。
let price = marsHabitatPricerOutput.price
priceLabel.text = priceFormatter.string(for: price)
注意
所生成的prediction(solarPanels:greenhouses:size:)方法会抛出异常。在使⽤Core ML 的时候,您⼤多数时候遇到的错误通常是:传递给⽅法的输入数据类型与模型预期的输入类型不同——例如,⽤错误格式表示的图片类型。在示例应用当中,预期的输入类型为 Double。所有的类型不匹配错误都会在编译时被捕获,如果遇到了了某种错误,那么示例应用就会弹出一个致命错误。
构建并运行 Core ML 应用
Xcode 会将 Core ML 模型编译到资源当中,从⽽而进⾏行行优化并能够在设备上运⾏行行。优化过的模 型表征会包含在您的应⽤用程序包当中,在应⽤用在设备上运⾏行行的时候,就可以⽤用之来进⾏行行预测。