Core ML 機器學習,coreml機器學習
在WWDC 2017開發人員大會上,蘋果宣布了一系列新的面向開發人員的機器學習 API,包括臉部辨識的視覺 API、自然語言處理 API,這些 API 整合了蘋果所謂的 Core ML 架構。Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智慧任務,支援深度神經網路、迴圈神經網路、卷積神經網路、支援向量機、樹整合、線性模型等。
概覽
藉助 Core ML,您可以將已訓練好的機器學習模型,整合到自己的應用當中。
支援作業系統:iOS 、macOS 、tvOS 、watchOS
所謂已訓練模型 (trained model),指的是對一組訓練資料應用了某個機器學習演算法後,所產生的一組結果。舉個例子,通過某個地區的曆史樓價來訓練出一個模型,那麼只要指定房間有幾臥幾衛,就有可能對未來該房間的樓價做出預測。
Core ML 是領域特定 (domain-specific) 架構和功能的基礎所在。Core ML 為 Vision 提供了影像處理的支援,為 Foundation 提供了自然語言處理的支援(例如 NSLinguisticTagger 類),為 GameplayKit 提供了對學習決策樹 (learned decision tree) 進行分析的支援。Core ML 本身是基於底層基本類型而建立的,包括 Accelerate、BNNS 以及 Metal Performance Shaders 等。
Core ML 針對裝置的效能進行了最佳化,最大限度地減少記憶體佔用和功耗。通過在裝置上啟動並執行嚴格要求,不僅保護了使用者資料隱私,而且當網路連接丟失的時候,還能夠保證應用能正常工作和響應。
擷取 Core ML 模型
擷取 Core ML 模型,以便能在您的應用當中使用。
Core ML 支援多種機器學習模型,其中包括了神經網路 (Neural Network)、組合樹 (Tree Ensemble)、支援向量機 (Support Vector Machine) 以及廣義線性模型 (Generalized Linear Model)。Core ML 的運行需要使用 Core ML 模型格式(也就是以 .mlmodel 副檔名結尾的模型)。
Apple 提供了一些常見的開源模型供大家使用,這些模型已經使用了 Core ML 模型格式。您可以自行下載這些模型,然後就可以開始在應用中使用它們了。此外,其他的研究機構和大學都發布了不少機器學習模型和訓練資料,這些往往都不是以 Core ML 模型格式發布出來的。如果您打算使用這些模型的話,需要對它們進行轉換,具體內容詳見「將已訓練模型轉換為 Core ML」。
將 Core ML 模型整合到應用中
嚮應用中添加一個簡單的模型,然後向模型中傳入輸入資料,並對模型的預測值進行處理。
點擊此處下載樣本應用。
概述
本樣本應用使用了一個已訓練模型 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 模型編譯到資源當中,從而進行最佳化並能夠在裝置上運行。最佳化過的模型表徵會包含在您的應用程式套件組合當中,在應用在裝置上啟動並執行時候,就可以用之來進行預測。
將已訓練模型轉換為 Core ML
將由第三方機器學習工具所建立的已訓練模型,轉換為 Core ML 模型格式。
概述
如果您已經使用了第三方機器學習工具來建立和訓練模型,只要這個工具是受支援的,那麼就可以使用 Core ML Tools 來將這些模型轉換為 Core ML 模型格式。表 1 列出了我們支援的模型和第三方工具。
注意
Core ML Tools 是一個 Python 包 (coremltools),並掛載在 Python Package Index (PyPI) 上。要瞭解關於 Python 包的更多資訊,請參閱 Python Packaging User Guide。
模型轉換
您可以使用 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')
根據您模型的不同,您可能會需要更新輸入、輸出以及相關的參數標籤,或者您還可能會需要聲明圖片名稱、類型以及格式。轉換工具內建了更詳細的文檔,因為可用的選項因工具而異。
或者,還可以編寫自訂的轉換工具
如果您需要轉換的格式不在表 1 當中,那麼您可以建立自己的轉換工具。
編寫自訂的轉換工具,包括了將模型的輸入、輸出和架構表示轉換為 Core ML 模型格式。您可以通過將每一層模型架構,以及層之間的串連關係進行定義,來實現這個操作。您可以通過 Core ML Tools 所提供的轉換工具作為參考;它們示範了如何將各種第三方工具建立的模型類型,轉換為 Core ML 模型格式。
注意
Core ML 模型格式由一系列 Protocol Buffer 檔案所定義,具體資訊請參見 Core ML Model Specification。
Core ML API
直接使用 Core ML API,從而支援自訂工作流程以及更為進階的用例。
在絕大多數情況下,您只需要與模型動態產生的介面進行互動即可,也就是說當您將模型添加到 Xcode 項目當中的時候,這個介面就由 Xcode 自動建立完畢了。您可以直接使用 Core ML API,以便支援自訂工作流程或者更為進階的用例。舉個例子,如果您需要將輸入資料非同步收集到自訂結構體,從而來執行預測的話,那麼您就可以讓這個結構體實現 MLFeatureProvider 協議,從而來為模型提供輸入功能。
具體的 API 列表請參見 Core ML API。