1. 程式人生 > >Core ML 機器學習

Core ML 機器學習

arpa pypi 循環 -type 自然 ror fat 操作系統 pick

在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。

Core ML 機器學習