本文是對Raywenderlich上的mac/iOS平臺機器學習文章Create ML Tutorial:Getting Started的翻譯.
因爲譯者對機器學習瞭解不夠深刻,翻譯的疏漏再所不免,敬請原諒.html
本文資料下載python
Create ML就是蘋果決心的證實:蘋果決心讓你更簡單在app中使用機器學習模型.在本教程中,你將學習如何用Create ML加速工做流程:經過改進數據來改進模型,而且經過使用Xcode和Swift來下降學習曲線.ios
與此同時,你還會更加熟悉ML工具集和術語.而不須要引入數學! 你不須要知道如何編寫一個編譯器來使用Swift,你也不須要編寫一個新的ML算法來使用分類器.有了Create ML,你就沒有了不開始學習機器學習的理由!git
Apple ML的簡明歷史:github
本教程中,你將從一個Create ML小技巧開始:建立一個帶有GUI的圖片分類器,使用的圖片來自Kaggle Cats and Dogs Dataset.而後,你將其和使用一樣數據集的Turi Create示例進行對比.正如你看到的那樣,Turi Create更加手動化,但它也更加靈活,一點也不難以理解!對於基於代碼的示例,你將對比Create ML和Turi Create文本分類器代碼.算法
而後我將會向你展現如何快速建立環境以使用Turi Create.蘋果甚至修改了Xcode的playgrounds,讓它更接近Jupyter Notebook(此前被稱爲 IPython notebook是一個交互式筆記本,支持運行 40 多種編程語言),這樣代碼環境會讓人更加熟悉! 試一下,你將用Turi Create在Jupyter notebook中,給相同數量的貓和狗的數據集建立一個圖片類似度模型.macos
你能夠耐心等待並但願蘋果將Turi Create的其他功能轉移到Create ML中,可是你會發現用Create ML作爲墊腳石來直接使用Turi Create並不困難.若是你須要的更多信息,咱們還有教程教你使用 Keras, scikit-learn and Caffe (稍後推出).一旦你熟悉了開發環境,那麼,ML領域有大量的教程,可供你選擇.編程
注意:Swift for TensorFlow呢?Create ML是給Swift用戶的ML工具,而Swift for TensorFlow是給ML用戶的Swift語言——該項目目標是提供一個更好的編程語言,和編譯器.json
要學習本教程,你須要:swift
點擊文章開頭或結尾處的下載資料按鈕.starter文件夾中包含了:
首先,準備你的數據 —— 你將用來訓練一個圖片分類器模型來識別貓和狗的圖片.當你展現一張圖片,它將返回標籤"Cat"或"Dog".要訓練這個模型,你須要一個Cat文件夾和一個Dog文件夾.理想的狀況下,這兩個文件夾應該有一樣數量的圖片 —— 若是你有30張貓的圖片和200張狗的圖片,那模型將會偏向於將圖片識別爲Dog.不要包含任何同時有多種動物的圖片.
每一個類須要多少張圖片?至少10張,可是更多的圖片會讓模型更加精準.Kaggle Cats and Dogs Dataset中每一個類有12500張圖片,但你並非所有須要!訓練的時間會隨着圖片數量而增加,圖片數量加倍的話,訓練時間大體也會加倍.
爲了訓練一個Create ML圖片分類器,你須要給它一個訓練數據集(training dataset) —— 一個包含了分類文件夾的文件夾.事實上,在starter文件夾中包含兩個我準備好的數據集,Pets-100和Pets-1000.
你將從訓練Pets-100模型開始,而後用Pets-Testing測試.而後用Pets-1000訓練,用Pets-Testing測試.
在Xcode 10中,建立一個新的 macOS 版的 playground,而後輸入下面代碼:
import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()
複製代碼
顯示輔助編輯區,點擊運行按鈕:
你將建立並展現一個交互式的視圖,來訓練和驗證一個圖片分類器.它神奇地讓你體驗不一樣的數據集 —— 由於最重要的不是誰有最好的算法,而是誰有最好的數據.算法目前已經很好了,你可讓數據科學家研究它以變得更好.可是垃圾數據進去,垃圾模型出來;絕大部分時間,精力,花費在了爲機器學習策劃數據集上.那麼如今,這個GUI圖片分類器幫助你提高數據規劃技巧! 能夠下載Kaggle Cats and Dogs Dataset並建立你本身的數據集.在你看到個人數據集產出後,你可能會想要更加認真從一大堆中挑選圖片.
拖拽Pets-100文件夾到視圖中.訓練進程當即開始了.在一段時間後,一個表格出如今debug區域,顯示Images Processed, Elapsed Time 和 Percent Complete:
這裏發生了什麼?這叫作遷移學習(transfer learning).底層模型 —— VisionFeaturePrint_Screen, 它支承了Vision framework —— 是預先用海量數據集訓練過的,能識別大量不一樣類型圖片.它經過學習從圖片中尋找哪些特徵features,及如何組合這些特徵來分類圖片.因此,你的數據集的訓練時間,實際就是抽取大約1000特徵的時間.這些特徵可能包括了低級的形狀和紋理,以及高級的形狀如耳朵,兩眼距離,口鼻形狀.而後它只花費了不多一部分時間來訓練一個邏輯迴歸(logistic regression) 模型來將你的圖片分紅兩類.這就相似於將一條直線分紅離散的點,只不過是在1000的尺度上,而不是2.可是它仍然很是快:我這邊共了了1m 15s進行特徵抽取,0.177886 seconds進行訓練及應用邏輯迴歸.
遷移學習只能在,你的數據集特徵點很是相似於訓練模型的數據集特徵點時,才能成功運行.一個在ImageNet上預先訓練的模型 —— 通過大量真實照片訓練 —— 可能沒法遷移到鉛筆畫或顯微照片上.
你可能想要再瀏覽兩篇有趣的文章,關於Google Brain/Research中的特徵:
注意:我是在early-2016 MacBook with 1.1GHz CPU上運行的Create ML.你的時間可能會更快,尤爲是當你的Mac是最新款時,或更新的macOS,Xcode版本等
在2017 MacBook Pro with a 2.9GHz i7 CPU, 特徵抽取時間降低到11.27s 訓練只花費了 0.154341 seconds.
當訓練完成後,視圖上顯示Training及Validation準確率指標,及debug區域的詳情.
那麼什麼是驗證(validation)?準確率(accuracy)數值是什麼意思? Training accuracy很簡單:訓練涉及到猜想每一個特徵的權重.由於你給圖片的標籤是"Cat"或"Dog",訓練算法可以檢驗它的答案並計算正確的百分比.而後,反饋出正確或錯誤信息給下一次迭代來細化權重. Validation accuracy也相似:在訓練開始前,從數據集中隨機挑選10%放到驗證數據中.像訓練集同樣,特徵被抽取出,答案被計算出來並帶有權重.可是結果不用在直接重計算權重上.他們的目的是爲了防止模型過擬合overfitting —— 過度關注一些不重要的特徵上,如背景色或燈光.若是驗證準確率和訓練準確率很是不一樣,算法會自動調整.因此,驗證圖片的選擇,同時影響了驗證準確率和訓練準確率.Turi Create讓你提供一個固定的驗證數據集,若是你已經給你的測試數據建立了一個相似特徵參數的話.而且你的測試數據集是用戶給app提供的照片的表明.
真正的問題是:模型如何給沒有訓練過的圖片分類?
視圖提示你拖拽圖片以開始測試:拖拽Pets-Testing文件夾到視圖中.很快,在debug區域展現出評估(Evaluation) 準確率,及其詳情:
在上圖中,我點擊展現按鈕來查看置信度:這個模型100%相信這是一條狗!可是仔細查看其餘照片會發現,模型對於其餘質量很差的照片依然獲得了正確答案.
這個Pets-100訓練數據集每一個類只有50張照片.Create ML讓嘗試不一樣數據集變得簡單,來看看更多的數據如何改善準確率.
點擊playground的stop按鈕,而後當它變成run時再點擊一次.這樣加載一個新的視圖,準備好接受訓練數據.
確保你的訓練數據足夠多樣化,可以匹配你的測試數據,而且這兩個數據集和你的app上用戶上傳的圖片數據足夠相似.
訓練1000張圖片獲得100%的訓練準確率,但只有96%的驗證準確率,咱們能夠多運行幾回,有時能獲得99%的驗證準確率.
這個示例程序的準確率至關的好 —— 底層模型極可能已經知道了貓和狗.可是,若是你在訓練不一樣的類型,獲得了一個很低的訓練準確率,你可能會試着將最大迭代次數(Max iterations) 設置爲20.
中止並從新開始 playground,而後點擊右上角的展開符號,將10改成20,而後按回車:
點擊展開符號以關閉設置,而後打開檢查一次,確保仍是20.
注意:在Create ML 和 Turi Create中建立都是個問題 —— 你不能不建立就訓練模型.爲了增長迭代的次數,你必須從頭開始並像原來同樣抽取特徵.Create ML GUI並無提供選項以保存特徵.在那些更加手動的框架中,如Keras,能夠構造,編譯,而後調整模型,因此調整操做隻影響了後面的操做.事實上這是有可能的,對應到Turi Create源碼中,拿出抽出圖片特徵點的低級別代碼 —— 這部分不少時候最有用.而後你能夠保存抽出的特徵,並在你想要更多迭代次數時從新加載它們! 但願這些能讓你對Turi Create和Keras更加感興趣!
這裏又是蘋果的特殊技巧.Create ML GUI輸出一個Core ML模型,而後直接拖拽你的模型到舊的Core ML項目中,只要改變代碼中的一個單詞,就能夠運行了!
點擊右上角的展開符號,會看到一個不一樣的設置項.點擊文本,改爲PetsClassifier.更改Where位置爲starter文件夾,而後點擊save:
打開starter文件夾中的ClassifyingImagesWithVisionAndCoreML項目.這是蘋果2017年的項目,我已經把它升級到了Swift 4.2,並修復了照片讀取的問題.這個項目用了MobileNet.mlmodel,大小爲17.1MB:
拖拽PetsClassifier.mlmodel到項目的導航區中.它的大小是17KB:
搜索項目中的MobileNet:
let model = try VNCoreMLModel(for: PetsClassifier().model)
複製代碼
構建並運行.點擊相機圖標進入照片選擇器,而後拖拽一些狗和貓的圖片到Photos中:
這段代碼來自Turi Create image classifier example,使用了一樣的數據集 —— 完整的25000張圖片的數據集:
import turicreate as tc
# 1. Load images (Note: you can ignore 'Not a JPEG file' errors)
data = tc.image_analysis.load_images('PetImages', with_path=True)
# 2. From the path-name, create a label column
data['label'] = data['path'].apply(lambda path: 'dog' if '/Dog' in path else 'cat')
# Note: If you have more than two classes, extract the folder names like this:
# train_data["label"] = train_data["path"].apply(lambda path: os.path.basename(os.path.split(path)[0]))
# 3. Make a train-test split
train_data, test_data = data.random_split(0.8)
# 4. Create the model
model = tc.image_classifier.create(train_data, target='label')
# 5. Save predictions to an SArray
predictions = model.predict(test_data)
# 6. Evaluate the model and save the results into a dictionary
metrics = model.evaluate(test_data)
print(metrics['accuracy'])
# 7. Save the model for later use in Turi Create
model.save('mymodel.model')
# 8. Export for use in Core ML
model.export_coreml('MyCustomImageClassifier.mlmodel')
複製代碼
這比你在playground中寫的代碼要多不少,可是你很快就會看到它是相似於Create ML文本分類器代碼.
和你在Create ML中所作的相似:
注意:在第2步中,只抽取兩個類的標籤是一個特例.我已經在代碼中加一個註釋,來展現普通的狀況.首先,os.path.split() 將路徑分離爲兩部分:文件名(如42.jpg),及其餘部分.而後os.path.basename() 是最後一個文件夾的名字,也是類的名字.
因此,Turi Create圖片分類是比Create ML更多手動操做,但更多靈活性.turicreate.create() 的文檔列出了一些可選參數.你能夠指定底層model以匹配Create ML,注意看Core ML模型的尺寸!若是你已經建立了一個真正的測試數據,不想讓模型使用從你的訓練數據中隨機選擇的測試數據,那麼你還能設置固定的validation_set.
在Create ML中圖片分類是一個很是特殊的例子:MLImageClassifierBuilder的GUI界面使們編寫代碼再也不是必須的了.但在下一章節中,你會看到其餘Create ML模型仍是須要不少代碼.
如今來比較一下,Create ML 和 Turi Create 是如何訓練及測試文本分類模型的.Turi Create模型須要將測試文本轉換進bag of words裏 —— 而在Create ML模型中,這步轉換是直接內置在Create ML模型中的,因此直接接收測試文本文件夾就能夠了.
下面是 Create ML文本分類器示例:
import CreateML
// 1. Load data from a JSON file
let data = try? MLDataTable(contentsOf: URL(fileURLWithPath: "<#/path/to/read/data.json#>"))
// 2. Make a train-test split
let (trainingData, testingData) = data.randomSplit(by: 0.8, seed: 5)
// 3. Create the model
let sentimentClassifier = try? MLTextClassifier(trainingData: trainingData,
textColumn: "text", labelColumn: "label")
// 4. Training accuracy as a percentage
let trainingAccuracy = (1.0 - sentimentClassifier.trainingMetrics.classificationError) * 100
// 5. Validation accuracy as a percentage
let validationAccuracy = (1.0 - sentimentClassifier.validationMetrics.classificationError) * 100
// 6. Evaluation accuracy as a percentage
let evaluationMetrics = sentimentClassifier.evaluation(on: testingData)
let evaluationAccuracy = (1.0 - evaluationMetrics.classificationError) * 100
// 7. Add metadata
let metadata = MLModelMetadata(author: "John Appleseed",
shortDescription: "A model trained to classify movie review sentiment", version: "1.0")
// 8. Export for use in Core ML
try? sentimentClassifier.write(to: URL(fileURLWithPath: "<#/path/to/save/SentimentClassifier.mlmodel#>"),
metadata: metadata)
複製代碼
WWDC 2018 Session 703中的另外一種加載標籤文本數據的方法:
let trainDirectory = URL(fileURLWithPath: 「/Users/createml/Desktop/train」)
let testDirectory = URL(fileURLWithPath: 「/Users/createml/Desktop/test」)
// Create Model
let classifier = try MLTextClassifier(trainingData: .labeledDirectories(at: trainDirectory))
複製代碼
回到文本分類器主代碼中:
這些代碼來自咱們的教程Natural Language Processing on iOS with Turi Create.它用10個詩人的詩集訓練了一個句子分類器,來預測測試文本的做者.
import turicreate as tc
# 1. Load data from a JSON file
data = tc.SFrame.read_json('corpus.json', orient='records')
# 2. Create the model
model = tc.sentence_classifier.create(data, 'author', features=['text'])
# 3. Export for use in Core ML
model.export_coreml('Poets.mlmodel')
複製代碼
在Turi Create教程資料中包含一個iOS的app,你能夠將文本粘貼在textview中來測試模型.這個app使用了一個wordCounts(text:) 函數,做用相似於Turi Create text classification example末尾的bag of words函數.
這個Turi Create文本分類器指望輸入是以字典形式的單詞和單詞數.而Create ML文本分類器直接接收文本輸入,並建立本身的bag of words.
如今請深呼吸 —— 你將深刻Turi Create 冒險了!
Turi Create還有其餘五個任務處理工具集(task-focused toolkits)目前暫未包含在Create ML中:
貓狗的圖片看起來很是有趣,因此你將訓練一個模型來找到類似圖片.
是的,你如今須要寫點Python了.開發環境用Jupyter notebook你會感受很熟悉 —— 它很像是一個Xcode的playground,可是運行在你的瀏覽器中.
最簡單的方式是使用Anaconda —— 它是ML社區建立的,用來整理全部版本的Python和ML庫,並在單獨的環境(environments) 中管理它們.
下載Python 3.6 version of Anaconda for macOS,在你的home directory中安裝它,不要在root目錄:
注意:安裝Anaconda及建立Tuti Create環境會花費幾分鐘時間.當你在等待時,能夠瀏覽下Michael Kennedy在2014年十一月發表的Comparison of Python and Swift Syntax和Jason Brownlee在2016年五月發表的Crash Course in Python for Machine Learning Developers.Brownlee的文章包含了使用數據科學庫NumPy, Matplotlib 和 Pandas的示例.Swift和Python語法的最大不一樣是當你定義閉包,函數和類的時候,用縮進而不是 {...} .
可使用Anaconda Navigator GUI或者終端(Terminal)命令來建立環境,來運行Turi Create代碼.
GUI:打開Anaconda Navigator,切換到Environments標籤頁面,並導入starter/turienv.yaml —— 點擊文件夾圖標並在Finder中設置文件位置. Anaconda Navigator將會從文件中填充環境名稱:
conda env create -f <drag starter/turienv.yaml file from Finder>
複製代碼
在turienv環境下,用GUI或Terminal命令來啓動 Jupyter notebook.
首先,在Finder中,建立一個本地文件夾命名notebooks.
若是你用的是最新的Mac,下載解壓Kaggle Cats and Dogs Dataset,而後移動PetImages文件夾到notebooks中,這樣你就能夠輕鬆將其加載到notebook中.
完整的Kaggle數據集包含25000張圖片,在老的Mac上須要花很長時間來處理.也可使用Pets-1000文件來代替,或者建立你本身的數據集.
GUI:若是你使用Anaconda Navigator,切換到Home標籤頁,點擊Applications on上的turienv,而後點擊jupyter Launch:
source activate turienv
複製代碼
這個命令行提示符(command line prompt)如今帶有 (turienv) 啓動.輸入下面命令來在notebooks文件夾中啓動Jupyter服務器,並顯示瀏覽器窗口:
jupyter notebook <drag notebooks folder from the Finder>
複製代碼
建立一個新的Python 3.6 notebook:
注意:這個示例和蘋果的Image similarity示例同樣,只是用了貓和狗數據集.
在notebook中包含了一個空白單元格.在單元格中輸入下面一行,而後點擊Shift-Enter來運行單元格:
import turicreate as tc
複製代碼
注意:Shift-Enter在Xcode playground中也可使用,若是你只想運行一段代碼的話.
又一個新的單元格出現了.輸入下面內容,而後運行:
reference_data = tc.image_analysis.load_images('./PetImages')
reference_data = reference_data.add_row_number()
reference_data.save('./kaggle-pets.sframe')
複製代碼
如今你正在將圖片加載到表格中,並給表格添加行號,而後保存以供未來使用.忽略JPEG decode failure信息.
注意:當輸入Python代碼時,使用tab鍵來自動補全.
在下一個單元格中,運行下面語句來檢索數據:
reference_data.explore()
複製代碼
一個新窗口打開,顯示id,路徑和圖片列.將光標移動到行上,展現圖片:
接下來,運行下面語句:
model = tc.image_similarity.create(reference_data)
複製代碼
這會花費一段時間 —— 在 [ * ] 中顯示它正在運行.在等待的時候,閱讀一下無監督學習(unsupervised learning) 吧.
注意:若是須要在完成前手動中止單元格,點擊Stop按鈕(在工具條中Run旁邊).能夠從PetImages中刪除圖片,或只加載Pets-1000.我在個人2015款MacBook Pro運行時,出去吃了午餐,90分鐘回來後才運行完成.
提供標籤數據給圖片分類器,能讓它經過檢測本身的預測與標籤的差別,來衡量準確率.這就是監督學習(supervised learning).
然而,有時儘管你提供了一樣的標籤數據集給一個圖片類似訓練器,它也並不使用這些標籤:這個模型使用的是無監督學習(unsupervised learning).基礎模型查看很是大量的圖片,並教會本身,哪些像素組合會構成特徵(features),能夠用來聚類(cluster) "類似"的圖片.因此正如圖片分類器同樣,大部分訓練時間被用來從你的數據集中抽取特徵.而後,它進行"暴力"最近鄰居(nearest neighbors)模型訓練:對於每張圖片,它計算其到其它圖片的距離(distance),並將其它圖片按半徑排序.而後,再一次與抽取出的特徵點比較,這一步會很快.
當模型準備好後,運行下面幾行:
query_results = model.query(reference_data[0:10], k=10)
query_results.head()
複製代碼
這樣,你就將包含10張reference_data圖片的數組傳了進去,計算10張各自的類似度,而後展現query_results的前10行.
假設你想要看第10張的類似圖片.首先,看看它是什麼:
reference_data[9]['image'].show()
複製代碼
因此,運行這幾行代碼:
similar_rows = query_results[query_results['query_label'] == 9]['reference_label']
reference_data.filter_by(similar_rows, 'id').explore()
複製代碼
恭喜你! 你如今已經用Python建立了一個圖片類似度模型! 你的Mac也沒有累爆炸.但願,你也會嘗試一下在你本身的數據上運行其它Turi Create示例.
退出登陸(Log out) jupyter 瀏覽窗口.
在終端(Terminal)窗口中,jupyter服務器正在運行,按Control-C-C來中止服務器.
若是你的命令行提示符(command line prompt)是以 (turienv) 啓動的,輸入下面指令來退出(exit):
source deactivate
複製代碼
若是你真的不想再使用Anaconda了,輸入下面命令:
rm -rf ~/anaconda3
複製代碼
完整版Turi Create notebook 和 iOS project放在本文資料中的finished文件夾中.在開頭或結尾處能夠下載.
如今你已經學會了在Create ML中用數據集進行實驗,但願你能繼續學習Turi Create.
探索Create ML及其官方文檔,同時也要花點時間瀏覽Turi Create User Guide,即便你不想使用Python.在Turi Create的How it works文檔中,提供了大量的資料,而且無需深奧的數學知識.想要了解更多,參照他們的學術引用連接.
下面,是繼續學習的一些資源:
本文是咱們系列ML教程中的最新篇.其它還有:
我但願你喜歡本Create ML教程,若是你有任何問題或意見,請在下面評論.特別是記得告訴咱們你用Create ML和Turi Create作什麼!
本文資料下載