Core ML介绍 (Apple机器学习框架)
概覽
借助 Core ML,您可以將已訓練好的機器學習模型,集成到自己的應用當中。
所謂已訓練模型 (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。
| 神經網絡 (Neural network) | 前饋 (Feedforward)、卷積 (Convolutional)、循環 (Recurrent) | Caffe / Keras 1.2.2 |
| 組合樹 (Neural networks) | 隨機森林 (Random Forests)、提升樹 (Boosted Trees)、決策樹 (Decision Trees) | scikit-learn 0.18 / XGBoost 0.6 |
| 支持向量機 (Support vector machines) | 標量回歸 (Scalar Regression)、多級分類 (Multiclass classification) | scikit-learn 0.18 / LIBSVM 3.22 |
| 廣義線性模型 (Support vector machines) | 線性回歸 (Linear Regression)、邏輯回歸 (Logistic Regression) | scikit-learn 0.18 |
| 特征工程 (Feature engineering) | 稀疏向量矢量化 (Sparse Vectorization)、稠密向量矢量化 (Dense Vectorization)、分類處理 (Categorical Processing) | scikit-learn 0.18 |
| 管道模型 (Pipeline models) | 順序鏈模型 (Sequentially Chained Models) | scikit-learn 0.18 |
模型轉換
您可以使用 Core ML 轉換器,并根據對應的模型第三方工具,來對模型進行轉換。通過調用轉換器的?convert?方法,然后再將結果保存為 Core ML 模型格式 (.mlmodel)。
例如,如果您的模型是使用 Caffe 來創建的,您可以將 Caffe 模型 (.caffemodel) 傳遞給?coremltools.converters.caffe.convert?方法。
然后將結果保存為 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。
原文地址: http://www.jianshu.com/p/6c2dff59eaaf
sample code
https://docs-assets.developer.apple.com/published/51ff0c1668/IntegratingaCoreMLModelintoYourApp.zip
開源模型
有時間我來比較一下Core ML和TensorFlow Lite的性能。
總結
以上是生活随笔為你收集整理的Core ML介绍 (Apple机器学习框架)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone如何使用CoreNFC
- 下一篇: XGBoost入门