在WWDC 2017開發(fā)者大會(huì)上,蘋果宣布了一系列新的面向開發(fā)者的機(jī)器學(xué)習(xí) API,包括面部識(shí)別的視覺(jué) API、自然語(yǔ)言處理 API,這些 API 集成了蘋果所謂的 Core ML 框架。Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智能任務(wù),支持深度神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、支持向量機(jī)、樹集成、線性模型等。

概覽

借助 Core ML,您可以將已訓(xùn)練好的機(jī)器學(xué)習(xí)模型,集成到自己的應(yīng)用當(dāng)中。

支持操作系統(tǒng):iOS 、macOS 、tvOS 、watchOS

 

 

所謂已訓(xùn)練模型 (trained model),指的是對(duì)一組訓(xùn)練數(shù)據(jù)應(yīng)用了某個(gè)機(jī)器學(xué)習(xí)算法后,所生成的一組結(jié)果。舉個(gè)例子,通過(guò)某個(gè)地區(qū)的歷史房?jī)r(jià)來(lái)訓(xùn)練出一個(gè)模型,那么只要指定房間有幾臥幾衛(wèi),就有可能對(duì)未來(lái)該房間的房?jī)r(jià)做出預(yù)測(cè)。

 

Core ML 是領(lǐng)域特定 (domain-specific) 框架和功能的基礎(chǔ)所在。Core ML 為 Vision 提供了圖像處理的支持,為 Foundation 提供了自然語(yǔ)言處理的支持(例如 NSLinguisticTagger 類),為 GameplayKit 提供了對(duì)學(xué)習(xí)決策樹 (learned decision tree) 進(jìn)行分析的支持。Core ML 本身是基于底層基本類型而建立的,包括 AccelerateBNNS 以及 Metal Performance Shaders 等。

 

 

Core ML 針對(duì)設(shè)備的性能進(jìn)行了優(yōu)化,最大限度地減少內(nèi)存占用和功耗。通過(guò)在設(shè)備上運(yùn)行的嚴(yán)格要求,不僅保護(hù)了用戶數(shù)據(jù)隱私,而且當(dāng)網(wǎng)絡(luò)連接丟失的時(shí)候,還能夠保證應(yīng)用能正常工作和響應(yīng)。

 

獲取 Core ML 模型

 

獲取 Core ML 模型,以便能在您的應(yīng)用當(dāng)中使用。

 

Core ML 支持多種機(jī)器學(xué)習(xí)模型,其中包括了神經(jīng)網(wǎng)絡(luò) (Neural Network)、組合樹 (Tree Ensemble)、支持向量機(jī) (Support Vector Machine) 以及廣義線性模型 (Generalized Linear Model)。Core ML 的運(yùn)行需要使用 Core ML 模型格式(也就是以 .mlmodel 擴(kuò)展名結(jié)尾的模型)。

 

Apple 提供了一些常見(jiàn)的開源模型供大家使用,這些模型已經(jīng)使用了 Core ML 模型格式。您可以自行下載這些模型,然后就可以開始在應(yīng)用中使用它們了。此外,其他的研究機(jī)構(gòu)和大學(xué)都發(fā)布了不少機(jī)器學(xué)習(xí)模型和訓(xùn)練數(shù)據(jù),這些往往都不是以 Core ML 模型格式發(fā)布出來(lái)的。如果您打算使用這些模型的話,需要對(duì)它們進(jìn)行轉(zhuǎn)換,具體內(nèi)容詳見(jiàn)「將已訓(xùn)練模型轉(zhuǎn)換為 Core ML」。

 

將 Core ML 模型集成到應(yīng)用中

 

向應(yīng)用中添加一個(gè)簡(jiǎn)單的模型,然后向模型中傳入輸入數(shù)據(jù),并對(duì)模型的預(yù)測(cè)值進(jìn)行處理。

 

點(diǎn)擊此處下載示例應(yīng)用。

 

概述

 

本示例應(yīng)用使用了一個(gè)已訓(xùn)練模型 MarsHabitatPricer.mlmodel,用以預(yù)測(cè)火星上的殖民地價(jià)值。

 

將模型添加到 Xcode 項(xiàng)目中

 

要想將模型添加到 Xcode 項(xiàng)目當(dāng)中,只需要將模型拖曳進(jìn)項(xiàng)目導(dǎo)航器 (project navigator) 當(dāng)中即可。

 

您可以通過(guò)在 Xcode 中打開這個(gè)模型,從而來(lái)查看它的相關(guān)信息,其中包括有模型類型以及其預(yù)期輸入和輸出。模型的輸入為太陽(yáng)能板和溫室的數(shù)量,以及殖民地的規(guī)模大?。ㄒ杂€為單位)。模型的輸出則是對(duì)這個(gè)殖民地價(jià)值的預(yù)測(cè)。

 

 

用代碼創(chuàng)建模型

 

Xcode 同樣也會(huì)使用模型的輸入輸出信息,來(lái)自動(dòng)為模型生成一個(gè)自定義的編程接口,從而就可以在代碼當(dāng)中與模型進(jìn)行交互。對(duì)于這個(gè) MarsHabitatPricer.mlmodel 而言,Xcode 會(huì)生成相應(yīng)的接口,來(lái)分別表示模型本身(MarsHabitatPricer)、模型輸入 (MarsHabitatPricerInput) 以及模型輸出 (MarsHabitatPricerOutput)。

 

使用所生成的 MarsHabitatPricer 類的構(gòu)造器,便可以創(chuàng)建這個(gè)模型:

 

let model = MarsHabitatPricer()

 

獲取輸入值以傳遞給模型

 

示例應(yīng)用使用了 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)

 

使用模型來(lái)進(jìn)行預(yù)測(cè)

 

MarsHabitatPricer 類會(huì)生成一個(gè)名為 prediction(solarPanels:greenhouses:size:) 方法,從而就可以根據(jù)模型的輸入值來(lái)預(yù)測(cè)價(jià)值,在本例當(dāng)中,輸入值為太陽(yáng)能板的數(shù)量、溫室的數(shù)量以及殖民地的規(guī)模大?。ㄒ杂€為單位)。這個(gè)方法的結(jié)果為一個(gè) MarsHabitatPricerOutput 實(shí)例,這里我們將其取名為 marsHabitatPricerOutput。

 

guard let marsHabitatPricerOutput = try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size) else {

    fatalError("Unexpected runtime error.")

}

 

通過(guò)讀取 marsHabitatPricerOutput 的 price 屬性,就可以獲取所預(yù)測(cè)的價(jià)值,然后就可以在應(yīng)用的 UI 當(dāng)中對(duì)這個(gè)結(jié)果進(jìn)行展示。

 

let price = marsHabitatPricerOutput.price

priceLabel.text = priceFormatter.string(for: price)

 

注意

所生成的 prediction(solarPanels:greenhouses:size:) 方法會(huì)拋出異常。在使用 Core ML 的時(shí)候,您大多數(shù)時(shí)候遇到的錯(cuò)誤通常是:傳遞給方法的輸入數(shù)據(jù)類型與模型預(yù)期的輸入類型不同——例如,用錯(cuò)誤格式表示的圖片類型。在示例應(yīng)用當(dāng)中,預(yù)期的輸入類型為 Double。所有的類型不匹配錯(cuò)誤都會(huì)在編譯時(shí)被捕獲,如果遇到了某種錯(cuò)誤,那么示例應(yīng)用就會(huì)彈出一個(gè)致命錯(cuò)誤。

 

構(gòu)建并運(yùn)行 Core ML 應(yīng)用

 

Xcode 會(huì)將 Core ML 模型編譯到資源當(dāng)中,從而進(jìn)行優(yōu)化并能夠在設(shè)備上運(yùn)行。優(yōu)化過(guò)的模型表征會(huì)包含在您的應(yīng)用程序包當(dāng)中,在應(yīng)用在設(shè)備上運(yùn)行的時(shí)候,就可以用之來(lái)進(jìn)行預(yù)測(cè)。

 

將已訓(xùn)練模型轉(zhuǎn)換為 Core ML

 

將由第三方機(jī)器學(xué)習(xí)工具所創(chuàng)建的已訓(xùn)練模型,轉(zhuǎn)換為 Core ML 模型格式。

 

概述

 

如果您已經(jīng)使用了第三方機(jī)器學(xué)習(xí)工具來(lái)創(chuàng)建和訓(xùn)練模型,只要這個(gè)工具是受支持的,那么就可以使用 Core ML Tools 來(lái)將這些模型轉(zhuǎn)換為 Core ML 模型格式。表 1 列出了我們支持的模型和第三方工具。

 

注意

Core ML Tools 是一個(gè) Python 包 (coremltools),并掛載在 Python Package Index (PyPI) 上。要了解關(guān)于 Python 包的更多信息,請(qǐng)參閱 Python Packaging User Guide。

 

 

模型轉(zhuǎn)換

 

您可以使用 Core ML 轉(zhuǎn)換器,并根據(jù)對(duì)應(yīng)的模型第三方工具,來(lái)對(duì)模型進(jìn)行轉(zhuǎn)換。通過(guò)調(diào)用轉(zhuǎn)換器的 convert 方法,然后再將結(jié)果保存為 Core ML 模型格式 (.mlmodel)。

 

例如,如果您的模型是使用 Caffe 來(lái)創(chuàng)建的,您可以將 Caffe 模型 (.caffemodel) 傳遞給 coremltools.converters.caffe.convert 方法。

 

import coremltools

coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')

 

然后將結(jié)果保存為 Core ML 模型格式。

 

coreml_model.save('my_model.mlmodel')

 

根據(jù)您模型的不同,您可能會(huì)需要更新輸入、輸出以及相關(guān)的參數(shù)標(biāo)簽,或者您還可能會(huì)需要聲明圖片名稱、類型以及格式。轉(zhuǎn)換工具內(nèi)置了更詳細(xì)的文檔,因?yàn)榭捎玫倪x項(xiàng)因工具而異。

 

或者,還可以編寫自定義的轉(zhuǎn)換工具

 

如果您需要轉(zhuǎn)換的格式不在表 1 當(dāng)中,那么您可以創(chuàng)建自己的轉(zhuǎn)換工具。

 

編寫自定義的轉(zhuǎn)換工具,包括了將模型的輸入、輸出和架構(gòu)表示轉(zhuǎn)換為 Core ML 模型格式。您可以通過(guò)將每一層模型架構(gòu),以及層之間的連接關(guān)系進(jìn)行定義,來(lái)實(shí)現(xiàn)這個(gè)操作。您可以通過(guò) Core ML Tools 所提供的轉(zhuǎn)換工具作為參考;它們演示了如何將各種第三方工具創(chuàng)建的模型類型,轉(zhuǎn)換為 Core ML 模型格式。

 

注意

Core ML 模型格式由一系列 Protocol Buffer 文件所定義,具體信息請(qǐng)參見(jiàn) Core ML Model Specification。

 

Core ML API

 

直接使用 Core ML API,從而支持自定義工作流以及更為高級(jí)的用例。

 

在絕大多數(shù)情況下,您只需要與模型動(dòng)態(tài)生成的接口進(jìn)行交互即可,也就是說(shuō)當(dāng)您將模型添加到 Xcode 項(xiàng)目當(dāng)中的時(shí)候,這個(gè)接口就由 Xcode 自動(dòng)創(chuàng)建完畢了。您可以直接使用 Core ML API,以便支持自定義工作流或者更為高級(jí)的用例。舉個(gè)例子,如果您需要將輸入數(shù)據(jù)異步收集到自定義結(jié)構(gòu)體,從而來(lái)執(zhí)行預(yù)測(cè)的話,那么您就可以讓這個(gè)結(jié)構(gòu)體實(shí)現(xiàn) MLFeatureProvider 協(xié)議,從而來(lái)為模型提供輸入功能。

http://www.cnblogs.com/jukaiit/p/6973063.html