詳解蘋果Core ML:如何為iOS創建機器學習應用?

DanBaracchi 8年前發布 | 21K 次閱讀 數據挖掘 iOS開發 移動開發

在昨天開幕的 WWDC 2017 開發者大會上,蘋果宣布了一系列新的面向開發者的機器學習 API,包括面部識別的視覺 API、自然語言處理 API,這些 API 集成了蘋果所謂的 Core ML 框架;參閱機器之心報道《蘋果開發者大會WWDC 2017:首次全面展示蘋果的人工智能實力》。軟件主管兼高級副總裁 Craig Federighi 介紹說,Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智能任務,*支*持深度神經網絡、循環神經網絡、卷積神經網絡、支持向量機、樹集成、線性模型等。大會之后,蘋果開發者網站更新了相關文檔,對 Core ML 進行了更加詳細的介紹。機器之心在本文中對該文檔的內容進行了翻譯和整理。更多詳情可訪問原文檔。

Core ML 文檔地址:https://developer.apple.com/documentation/coreml

Core ML 介紹

使用 Core ML,你可以將訓練好的機器學習模型整合到你的應用中。它支持以下操作系統:

  • iOS 11.0+Beta
  • macOS 10.13+Beta
  • tvOS 11.0+Beta
  • watchOS 4.0+Beta

訓練好的模型(trained model)是將一個機器學習算法應用到一個訓練數據集之后所得到的結果。然后該模型可以基于新的輸入數據而進行預測。比如,如果一個模型在一個地區的歷史房價數據上進行了訓練,那么它就可能能夠根據房子的臥室和浴室數量來預測房價。

Core ML 是域特定的框架和功能的基礎。Core ML 支持用于圖像分析的 Vision;用于自然語言處理的 Foundation(比如

NSLinguisticTagger 類)和用于評估已經學習到的決策樹的 GameplayKit。 Core ML 本身構建于低層面的原語(primitives)之上,比如 Accelerate、BNNS 和 Metal Performance Shaders。

Core ML 也為設備性能進行了優化,從而減少了內存占用和功耗。嚴格在設備上運行能夠確保用戶數據的隱私,并且能保證你的應用在沒有網絡連接時也能夠工作和響應。

如何使用 Core ML?

獲取 Core ML 模型

如何將 Core ML 模型用在你的應用中?Core ML 支持大量機器學習模型,包括神經網絡、數集成、支持向量機和廣義的線性模型。Core ML 需要 Core ML 格式(.mlmodel)。蘋果已經以該格式提供了一些流行的開源模型,請訪問: https://developer.apple.com/machine-learning 。你可以下載這些模型,并用在你的應用中。另外,一些研究組和大學也會發布自己的模型和訓練數據,這些可能并不是 Core ML 模型格式的。要使用這些模型,請將其轉換成 Core ML 格式。

將 Core ML 模型用在你的應用中

下面給出了一個示例,將一個訓練好的模型 MarsHabitatPricer.mlmodel 用在了一個簡單應用中,以用來預測火星上的地價。

1.將模型添加到你的 Xcode 項目

通過將模型拖拽到項目導航即可將該模型添加到你的 Xcode 項目。

你可以在 Xcode 中打開模型來查看關于該模型的信息——包括模型的類型及其需要的輸入和輸出。該模型的輸入是太陽能電池板和溫室的數量,以及棲息地的大小(單位:英畝)。該模型的輸出是該棲息地的預測價格。

2.在代碼中創建模型

Xcode 也會使用關于該模型輸入和輸出的信息來自動生成一個該模型的自定義的編程接口,你可以在代碼中使用這些接口來和該模型進行交互。對于 MarsHabitatPricer.mlmodel,Xcode 會生成幾個接口,其中 MarsHabitatPricer 表示該模型,MarsHabitatPricerInput表示該模型的輸入,MarsHabitatPricerOutput則是該模型的輸出。

使用生成的 MarsHabitatPricer 類的初始化器來創建該模型:

let model = MarsHabitatPricer()

3.將輸入值輸入該模型

這個示例應用使用了 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)

4.使用模型來做預測

MarsHabitatPricer 類有一個生成的 prediction(solarPanels:greenhouses:size:)方法(method),可用于根據模型的輸入值預測一個價格。在這個案例中,輸入是太陽能電池板和溫室的數量,以及棲息地的大小(單位:英畝)。這個方法的結果是一個 MarsHabitatPricerOutput 實例 marsHabitatPricerOutput

guard let marsHabitatPricerOutput = try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size) else {
    fatalError("Unexpected runtime error.")
}

獲取 marsHabitatPricerOutput 的 price 屬性來獲取預測的價格,并將結果展示在該應用的用戶界面上:

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

注:生成的 prediction(solarPanels:greenhouses:size:) 方法可能會報錯。你會遇到的最常見的錯誤類型是你輸入該方法的數據的類型與該模型所需的輸入數據類型不符——比如,格式不對的圖片。在這個示例應用中,輸入是 Double 類型的。任何類型不匹配都會在編譯時顯現,對于這個示例應用而言,如果有什么地方不對,它就會報出一個致命錯誤。

5.構建和運行一個 Core ML 應用

Xcode 可以將該 Core ML 模型編譯成一個資源(resource),其已經為設備上的運行進行了優化。這種優化了的模型的表示被包含在你的應用捆綁(app bundle)中,而且該應用在設備上運行時會使用這個模型來進行預測。

將訓練好的模型轉換成 Core ML

如果你的模型是使用支持的第三方機器學習工具創建和訓練的,那么你可以使用 Core ML Tools(https://developer.apple.com/machine-learning ) 將其轉換成 Core ML 模型格式。下表給出了支持的模型和第三方工具。

Core ML Tools 是一個 Python 包(coremltools),托管在 Python Package Index (PyPI) 上。要了解更多有關 Python 包的信息,請參閱:https://packaging.python.org

模型類型支持的模型支持的工具神經網絡前饋、卷積、循環Caffe

Keras 1.2.2樹集成隨機森林、boosted trees、決策樹scikit-learn 0.18

XGBoost 0.6支持向量機標量回歸、多類分類scikit-learn 0.18

LIBSVM 3.22廣義的線性模型線性回歸、logistic 回歸scikit-learn 0.18特征工程稀疏矢量化、密集矢量化、分類處理scikit-learn 0.18Pipeline 模型順序鏈式模型scikit-learn 0.18 

轉換你的模型

使用對應你的模型的第三方工具的 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')

根據你模型的需要,你可能需要更新輸入、輸出和標簽,或者你可能需要聲明圖像名、類型、格式。這些轉換工具捆綁了更多文檔,因工具不同,其提供的選項也有所不同。

你也可以編寫自定義的轉換工具

當你需要轉換一個不在上表中的格式的模型時,你也可以創建你自己的轉換工具。

編寫你自己的轉換工具涉及到將你的模型的輸入、輸出和架構的表示(representation)翻譯成 Core ML 模型格式。你需要定義該模型架構的每一層以及它們與其它層的連接。使用 Core ML Tools 提供的轉換工具為例;它們演示了通過第三方工具創建的多種類型的模型被轉換成 Core ML 模型格式的方法。

注:Core ML 模型格式是由一些協議緩沖文件(protocol buffer files)定義的,具體描述請參閱: https://developer.apple.com/machine-learning

Core ML API

這個文檔包含了正在開發中的 API 和相關技術的初步信息。這些信息可能會發生變化,遵循這個文檔實現的軟件應該在最后的操作系統軟件上進行測試。了解更多使用蘋果 Beta 軟件的信息,訪問: https://developer.apple.com/support/beta-software/

在大多數案例中,你僅需要與你的模型的動態生成的接口進行交互,這些接口是 Xcode 自動生成的。你可以使用 Core ML API 直接支持自定義的工作流和高級的用例。比如,如果你需要做預測,同時異步地將輸入數據收集到一個自定義的結構中,你可以通過采用 MLFeatureProvider 協議來使用該結構來為你的模型提供輸入特征。

 

來自:https://www.jiqizhixin.com/articles/d49f994b-78e8-4028-b2e1-2e3412086be9

 

 本文由用戶 DanBaracchi 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!