蘋果在去年推出了CoreML機器學(xué)習(xí)模型,今年在XCode10中提供的CreateML framework,可以創(chuàng)建CoreML模型。
使用CreateML創(chuàng)建CoreML模型時,僅需編寫少量的代碼。
準(zhǔn)備工作
1、XCode10(目前是beta版本)
2、MacOS Mojave(目前也是beta版本)
3、訓(xùn)練數(shù)據(jù):在同一個目錄下,以文件夾作為分類,各個文件夾下存放對應(yīng)分類的圖片
4、測試數(shù)據(jù):和訓(xùn)練數(shù)據(jù)一樣,并且文件夾分類的名稱要和訓(xùn)練數(shù)據(jù)的名稱一致
說明:
1、訓(xùn)練數(shù)據(jù)可以自己準(zhǔn)備,也可以從網(wǎng)上找一些,例如:Kaggle Cats and Dogs Dataset(本文是以Pets-100目錄下的圖片進(jìn)行的訓(xùn)練)
2、訓(xùn)練數(shù)據(jù)數(shù)量越大,訓(xùn)練的模型越準(zhǔn)確,訓(xùn)練的時間也就越長
創(chuàng)建圖像分類CoreML模型
1、運行XCode10,創(chuàng)建一個空的playground工程,清除所有代碼,然后將下面的代碼拷貝在playground中
import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()
2、切換顯示XCode的assistant editor,再點擊運行

3、此時,XCode的assistant editor中,會顯示MLImageClassifierBuilder的live view,將訓(xùn)練數(shù)據(jù)的目錄拖拽進(jìn)來,XCode便開始訓(xùn)練CoreML模型了

4、將訓(xùn)練后的模型,保存到文件


5、應(yīng)用創(chuàng)建的模型進(jìn)行預(yù)測:將想要預(yù)測的圖片(或目錄)拖拽到模型上,進(jìn)行預(yù)測。例如,將Pets-1000目錄拖拽到Live view上,預(yù)測的準(zhǔn)確率如下
說明:除了在Live view中進(jìn)行預(yù)測外,也可以將保存后的模型導(dǎo)入到app中使用。參見Classifying Images with Vision and Core ML

創(chuàng)建文本分類模型
創(chuàng)建文本分類ML模型,可以使用MLDataTable和MLTextClassifier類。步驟如下:
1、創(chuàng)建一個MLDataTable對象,讀取訓(xùn)練數(shù)據(jù)(可以是JSON或CSV格式、或者Dictionary)
2、創(chuàng)建一個MLTextClassifier對象,使用MLDataTable對象中的數(shù)據(jù)進(jìn)行訓(xùn)練
3、通過MLTextClassifier對象的write(to:metadata:)方法,將模型保存到磁盤
csv文件格式示例:
title,author,pageCount,genre
Alice in Wonderland,Lewis Carroll,124,Fantasy
Hamlet,William Shakespeare,98,Drama
Treasure Island,Robert L. Stevenson,280,Adventure
Peter Pan,J. M. Barrie,94,Fantasy
JSON文件格式示例:
[
{
"title": "Alice in Wonderland",
"author": "Lewis Carroll",
"pageCount": 124,
"genre": "Fantasy"
},
{
"title": "Hamlet",
"author": "William Shakespeare",
"pageCount": 98,
"genre": "Drama"
}, ...
]
//Dictionary數(shù)據(jù)示例
let data: [String: MLDataValueConvertible] = [
??? "title": ["Alice in Wonderland", "Hamlet", "Treasure Island", "Peter Pan"],
??? "author": ["Lewis Carroll", "William Shakespeare", "Robert L. Stevenson", "J. M. Barrie"],
??? "pageCount": [124, 98, 280, 94],
??? "genre": ["Fantasy", "Drama", "Adventure", "Fantasy"]
]
let bookTable = try MLDataTable(dictionary: data)
示例代碼
在XCode創(chuàng)建一個空的playground工程,在資源中添加訓(xùn)練使用的數(shù)據(jù)spam-sms.csv,然后將下面的代碼粘貼到工程中
import Foundation
import CreateML
//獲取csv文件路徑
guard let trainingCSV = Bundle.main.url(forResource: "spam-sms", withExtension: "csv") else {
? ? fatalError()
}
//將csv文件內(nèi)容加載到MLDataTable中
var spamData = try MLDataTable(contentsOf: trainingCSV)
let (trainingData, testData) = spamData.randomSplit(by: 0.8, seed: 0)
//創(chuàng)建文本分類器,進(jìn)行訓(xùn)練
//message和label分別對應(yīng)csv文件中的短信內(nèi)容列、短信標(biāo)簽列
let predictor = try MLTextClassifier(trainingData: trainingData, textColumn: "message", labelColumn: "label")
//在測試數(shù)據(jù)集上驗證
let metrics = predictor.evaluation(on: testData)

說明:
使用400條中文短信內(nèi)容的csv,訓(xùn)練模型時,內(nèi)存占用十分嚴(yán)重,超過Mac系統(tǒng)的物理內(nèi)存,訓(xùn)練卡在解析短信的步驟,未能訓(xùn)練出模型。
使用英文短信內(nèi)容進(jìn)行訓(xùn)練時,沒有內(nèi)存問題,可以訓(xùn)練出模型。
其它
MLClassifier是一個通用的分類模型,MLRegressor是一個回歸模型,給定訓(xùn)練模型(MLDataTable)中的特征列和結(jié)果列后,就可以對這兩種模型進(jìn)行訓(xùn)練。
缺點
模型訓(xùn)練好后,如果增加了數(shù)據(jù)集,必須重新開始訓(xùn)練,即無法在訓(xùn)練好的模型上應(yīng)用新的數(shù)據(jù)進(jìn)行訓(xùn)練。
模型優(yōu)化
提高訓(xùn)練數(shù)據(jù)集上的準(zhǔn)確率(Training Accuracy)
對于MLImageClassifierBuilder,可以將訓(xùn)練的迭代次數(shù)調(diào)整成20次
對于自然語言的分類器,可以嘗試不同的算法(MLTextClassifier.ModelAlgorithmType)
對于MLClassifier和MLRegressor,則可以嘗試選用不同的模型進(jìn)行訓(xùn)練
提高驗證數(shù)據(jù)集上的準(zhǔn)確率(Validation Accuracy)
對于擬合不足的問題,可以通過增加訓(xùn)練數(shù)據(jù)集來進(jìn)行優(yōu)化。例如,對于圖像分類器,可以在訓(xùn)練時勾選Augmentation(增加)選項:

對于過擬合的問題,則可以嘗試減少迭代次數(shù)進(jìn)行優(yōu)化。
提高測試數(shù)據(jù)集上的準(zhǔn)確率(Evaluation Accuracy)
如果訓(xùn)練數(shù)據(jù)集、驗證數(shù)據(jù)集上的準(zhǔn)確率,高于測試數(shù)據(jù)集上的準(zhǔn)確率,原因通常是訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)存在比較明顯的差異導(dǎo)致,這種情況下,可以嘗試在訓(xùn)練數(shù)據(jù)集中使用更多的不同的數(shù)據(jù)。