在iOS平臺上,可以使用Core ML來集成經(jīng)過訓練的機器學習模型到你的APP。
對一組訓練數(shù)據(jù)應用機器學習算法會生成一個經(jīng)過訓練的模型,該模型會根據(jù)輸入數(shù)據(jù)來進行預測。例如,根據(jù)某個地區(qū)的歷史房價進行培訓的模型可能能夠在給定房屋的臥室和浴室數(shù)量時,預測該房屋的價格。
Core ML是框架和功能的基礎, Core ML對Vision的圖像分析,自然語言處理基礎(例如NSLinguisticTagger類)和用于評估學習決策樹的GameplayKit提供了支持。 Core ML本身建立在Accelerate和BNNS以及Metal Performance Shader的底層庫之上。

獲得Core ML模型
Core ML支持各種機器學習模型,包括神經(jīng)網(wǎng)絡,樹組合,支持向量機和廣義線性模型。 Core ML需要使用Core ML格式的模型(文件擴展名為.mlmodel的模型)。
蘋果提供了幾種流行的,已經(jīng)是Core ML格式的開源模式。 您可以下載這些模型并開始在你的APP中使用它們。 另外,各研究組和大學發(fā)布了他們的模型和培訓數(shù)據(jù),這些數(shù)據(jù)可能不是Core ML格式的模型。 要使用這些模型,您需要轉換它們,這些將在后續(xù)內容中會有具體介紹。
集成Core ML到你的APP
下面會集成一個簡單的模型到APP里,然后傳入數(shù)據(jù)到模型,并產(chǎn)出模型預測結果。
該示例應用程序使用經(jīng)過訓練的模型MarsHabitatPricer.mlmodel來預測火星上的棲息地價格。
添加模型到你的的Xcode項目
將模型拖放到項目導航目錄中就可以將模型添加到Xcode項目里。
您可以通過打開Xcode中的模型來查看有關模型的信息(包括模型類型及其預期輸入和輸出)。 模型的輸入數(shù)據(jù)是太陽能電池板和溫室的數(shù)量,以及棲息地的面積(按英畝)。 模型的輸出就是棲息地的預測價格。

在代碼中創(chuàng)建模型
Xcode還可以使用模型根據(jù)輸入、輸出信息自動生成的自定義編程接口,并可在代碼中與模型進行交互。 例如MarsHabitatPricer.mlmodel,Xcode生成了表示模型的(MarsHabitatPricer),模型輸入(MarsHabitatPricerInput)和模型輸出(MarsHabitatPricerOutput)的接口。
使用生成的MarsHabitatPricer類的初始化方法來創(chuàng)建模型:
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 :),用于根據(jù)模型的輸入值預測價格-- 在當前情況下,這些輸入值是指太陽能電池板的數(shù)量,溫室的數(shù)量和棲息地的大小(英畝)。 該方法的結果是一個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 :)方法可能會發(fā)生錯誤。 在使用Core ML時遇到的最常見的錯誤類型發(fā)生在你傳遞給該方法的輸入數(shù)據(jù)類型與模型所期望的輸入類型不匹配時,例如,錯誤格式的圖像。 在該APP中,輸入的類型為Double。 任何類型的不匹配在編譯時被捕獲,如果發(fā)生錯誤,示例APP會觸發(fā)一個致命錯誤。
建立和運行Core ML APP
Xcode會將Core ML模型編譯成經(jīng)過優(yōu)化以在設備上運行的資源。 該模型的優(yōu)化已經(jīng)包含在您的APP bundle中,并且表現(xiàn)在APP在設備上進行預測的過程中。
將訓練模型轉換為Core ML模型
將使用第三方機器學習工具創(chuàng)建的訓練模型轉換為Core ML模型的格式。
如果你的模型是使用已支持的第三方機器學習工具創(chuàng)建和訓練的,則可以使用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創(chuàng)建的,請將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')
根據(jù)您的模型類別,您可能需要更新輸入,輸出和標簽,或者你可能需要聲明相應的名稱,類型和格式。因為可用的選項因工具而異,轉換工具還有很多文檔。 有關Core ML Tools的更多信息,請參閱Package Documentation.
編寫自定義轉換工具
當您需要轉換的模型不是表1所列工具支持的格式時,可以創(chuàng)建自己的轉換工具。
編寫自己的轉換工具涉及到將模型的輸入,輸出和架構的表示轉換為Core ML模型的格式。 您可以通過定義模型架構的每一層及其與其他層的連接來實現(xiàn)。 可以使用Core ML Tools提供的轉換工具作為參照; 他們演示了如何將從第三方工具創(chuàng)建的各種模型類型轉換為Core ML模型的格式。
- 注意
Core ML模型格式由一組暫時協(xié)議文件定義,并在Core ML Model Specification中有詳細描述。