本文是對Raywenderlich上的mac/iOS平臺機器學習文章Create ML Tutorial:Getting Started的翻譯.
由於譯者對機器學習瞭解不夠深入,翻譯的疏漏再所難免,敬請原諒.
本文資料下載
Create ML就是蘋果決心的證明:蘋果決心讓你更簡單在app中使用機器學習模型.在本教程中,你將學習如何用Create ML加速工作流程:通過改進資料來改進模型,並且通過使用Xcode和Swift來降低學習曲線.
與此同時,你還會更加熟悉ML工具集和術語.而不需要引入數學! 你不需要知道如何編寫一個編譯器來使用Swift,你也不需要編寫一個新的ML演算法來使用分類器.有了Create ML,你就沒有了不開始學習機器學習的理由!
Apple ML的簡明歷史:
- Core ML:在WWDC 2017上宣佈,已經被每個主流ML平臺支援,可匯出已有模型.但是已有模型總是太大,並且/或者,太籠統.
- Turi Create:在WWDC 2017之後被收購,它能讓你用自己的資料來自定義現有模型.只不過是用...Python :[.
- IBM Watson Services:在2018年三月宣佈.你可以自定義IBM Watson的視覺識別模型來識別你自己的資料.只需拖拽你的資料,無需程式碼,但你需要使用IBM Cloud,並且Core ML模型是被Watson API包裝過的.
- Create ML:在WWDC 2018上宣佈.用Xcode和Swift的ML!目前,只包括了七個Turi Create重點工具集中的兩個,再加上一個通用分類器和迴歸量,還有資料表.我認為,這是一個引導你通向Turi Create宮殿的誘餌,宮殿裡面居住著一條"好狗"而不是邪惡女巫!(Turi Create的logo是一條狗.)
本教程中,你將從一個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中,給相同數量的貓和狗的資料集建立一個圖片相似度模型.
你可以耐心等待並希望蘋果將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語言——該專案目標是提供一個更好的程式語言,和編譯器.
開始
要學習本教程,你需要:
- 一臺Mac,執行macOS 10.14 Mojave beta
- Xcode 10.x beta
點選文章開頭或結尾處的下載資料按鈕.starter資料夾中包含了:
- Pets-100, Pets-1000 和 Pets-Testing:這些包含了貓和狗的圖片;你將用這些來訓練和驗證這個貓-狗分類器.
- ClassifyingImagesWithVisionAndCoreML:蘋果CoreML的示例程式;你將用自己在Create ML中訓練的模型替換其中的MobileNet模型.
- good-dog.png:一個附加的狗的圖片.
- turienv.yaml:你將用這個檔案來建立一個環境,來執行Turi Create程式碼.
Create ML圖片分類器
首先,準備你的資料 —— 你將用來訓練一個圖片分類器模型來識別貓和狗的圖片.當你展示一張圖片,它將返回標籤"Cat"或"Dog".要訓練這個模型,你需要一個Cat資料夾和一個Dog資料夾.理想的情況下,這兩個資料夾應該有同樣數量的圖片 —— 如果你有30張貓的圖片和200張狗的圖片,那模型將會偏向於將圖片識別為Dog.不要包含任何同時有多種動物的圖片.
每個類需要多少張圖片?至少10張,但是更多的圖片會讓模型更加精準.Kaggle Cats and Dogs Dataset中每個類有12500張圖片,但你並不是全部需要!訓練的時間會隨著圖片數量而增長,圖片數量加倍的話,訓練時間大致也會加倍.
為了訓練一個Create ML圖片分類器,你需要給它一個訓練資料集(training dataset) —— 一個包含了分類資料夾的資料夾.事實上,在starter資料夾中包含兩個我準備好的資料集,Pets-100和Pets-1000.
在完成模型訓練後,你將需要一個測試資料集(testing dataset) 來驗證模型:一個包含Cat和Dog資料夾的資料夾.測試資料集中的圖片應該與訓練資料集中的不同,因為你需要驗證的是當模型遇到沒見過的圖片時表現如何.如果你在收集自己的資料,你要將20%的圖片放到測試資料集中,其餘放在訓練資料集中.但我們每個類有12500張圖片,所以Pets-Testing包含了900-999張從每個類中抽取的圖片.你將從訓練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.
訓練&驗證準確率(validation accuracy)
當訓練完成後,檢視上顯示Training及Validation準確率指標,及debug區域的詳情.
我得到了100%訓練及驗證準確率!但你的數值可能不同,因為驗證集(validation set) 是從訓練會話中隨機挑選的,所以你的驗證集將會是不同的另外10張圖片.沒有辦法知道哪些圖片被選中.那麼什麼是驗證(validation)?準確率(accuracy)數值是什麼意思? Training accuracy很簡單:訓練涉及到猜測每個特徵的權重.因為你給圖片的標籤是"Cat"或"Dog",訓練演算法能夠檢驗它的答案並計算正確的百分比.然後,反饋出正確或錯誤資訊給下一次迭代來細化權重. Validation accuracy也類似:在訓練開始前,從資料集中隨機挑選10%放到驗證資料中.像訓練集一樣,特徵被抽取出,答案被計算出來並帶有權重.但是結果不用在直接重計算權重上.他們的目的是為了防止模型過擬合overfitting —— 過分關注一些不重要的特徵上,如背景色或燈光.如果驗證準確率和訓練準確率非常不同,演算法會自動調整.所以,驗證圖片的選擇,同時影響了驗證準確率和訓練準確率.Turi Create讓你提供一個固定的驗證資料集,如果你已經給你的測試資料建立了一個類似特徵引數的話.並且你的測試資料集是使用者給app提供的照片的代表.
評估(Evaluation)
真正的問題是:模型如何給沒有訓練過的圖片分類?
檢視提示你拖拽圖片以開始測試:拖拽Pets-Testing資料夾到檢視中.很快,在debug區域展示出評估(Evaluation) 準確率,及其詳情:
97%準確率:confusion matrix說,有兩張貓的圖片被誤分類成狗了,另有四張狗的照片被誤分類成貓了.檢視測試圖片,看看哪些被模型混淆了.有一張已經在上面圖中展示了,還有一張如下: 這兩張圖片是相當不好的:一個是模糊且太亮了,另一個是模糊且缺少頭部資訊.模型是重設了圖片尺寸到299x299,所以切除掉了一部分你關心的物體,他們理想情況下應該在圖片的中心部分,不能太大也不能太小.在上圖中,我點選展示按鈕來檢視置信度:這個模型100%相信這是一條狗!但是仔細檢視其他照片會發現,模型對於其他質量不好的照片依然得到了正確答案.
改進準確率
這個Pets-100訓練資料集每個類只有50張照片.Create ML讓嘗試不同資料集變得簡單,來看看更多的資料如何改善準確率.
點選playground的stop按鈕,然後當它變成run時再點選一次.這樣載入一個新的檢視,準備好接受訓練資料.
拖拽Pets-1000資料夾到檢視中.抽取1000張圖片的特徵需要的時間會是100張的五到十倍.等待的時候,可以看看蘋果的一篇有用的總結文章Improving Your Model’s Accuracy,它給出了改進不同準確率指標的具體建議.改進訓練準確率
- 增加圖片分類器的最大迭代數(Max iterations).(該選項在Xcode第一個beta版不能用,但beta 2版就可以使用了)
- 為文字分類器使用不同的演算法.
- 為通用分類器或迴歸量使用不同模型.
改進驗證準確率
- 增加資料量:對於圖片分類器,你可以給圖片資料增加引數,如翻轉flipping, 旋轉rotating, 斜切shearing或改變曝光exposure等.參見Apple’s illustration of data augmentation:
- 可能過擬合:減少最大迭代數(Max iterations).你可能不必為此擔憂,因為我的訓練只執行了不到10次就達到了滿意效果並停了下來.
改進評估準確率
確保你的訓練資料足夠多樣化,能夠匹配你的測試資料,並且這兩個資料集和你的app上使用者上傳的圖片資料足夠類似.
回到playground
訓練1000張圖片得到100%的訓練準確率,但只有96%的驗證準確率,我們可以多執行幾次,有時能得到99%的驗證準確率.
拖拽Pets-Testing資料夾到檢視中,來評估(evaluate)這個模型;它在200張測試圖片上得到了98.5%的準確率! 這次confusion matrix說模型將三個貓的圖片分類為狗.實際上,只有只有同樣的兩張是以100%置信度被錯誤標記為狗的. 儘管confusion matrix沒有報出錯誤,但仍然有兩張狗的照片被標識為貓,只是置信度較低.它們都是模糊不清,對比度低: 也許你想要更加改善模型,那就需要更多資料,要麼使用帶引數的1000張圖片,要麼使用Kaggle中的完整資料集.或者也可以對你的資料集進行挑選,忽略那些糟糕的圖片.可以大膽去體驗一下!記住這是很容易做到的,訓練更大的資料集只多花了一點時間.我嘗試過執行了5000張圖片:只花了32分鐘,我得到了99%的訓練準確率和驗證準確率...增加最大迭代次數(Max iterations)?
這個示例程式的準確率相當的好 —— 底層模型很可能已經知道了貓和狗.但是,如果你在訓練不同的型別,得到了一個很低的訓練準確率,你可能會試著將最大迭代次數(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程式碼段中,將MobileNet替換為PetsClassifier:let model = try VNCoreMLModel(for: PetsClassifier().model)
複製程式碼
構建並執行.點選相機圖示進入照片選擇器,然後拖拽一些狗和貓的圖片到Photos中:
選擇一張;這個app將認出的結果顯示在下面的label上:Turi Create圖片分類器
這段程式碼來自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中所做的類似:
- 第1步到第4步,對應於建立訓練和測試資料夾,然後拖拽訓練資料夾到檢視中.Turi Create必須從圖片路徑中抽取類的標籤,但第3步隨機分配20%的資料集到test_data,節約了你建立訓練和測試資料夾的工作,並且每次執行程式碼時都會得到一份不同的測試資料集.
注意:在第2步中,只抽取兩個類的標籤是一個特例.我已經在程式碼中加一個註釋,來展示普通的情況.首先,os.path.split() 將路徑分離為兩部分:檔名(如42.jpg),及其他部分.然後os.path.basename() 是最後一個資料夾的名字,也是類的名字.
- 第5步和第6步,對應於拖拽測試資料夾到檢視中.Jupyter notebook可以像Create ML檢視一個輕鬆展示predictions陣列.你還可以過濾資料來找到錯誤的分類,而不用遍歷檢視整個測試圖片集.
- 第7步,儲存模型以供使用,你可以重新載入它並執行在不同的測試資料集上.
- 第8步,輸出Core ML模型.
所以,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
下面是 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)
複製程式碼
- 第1步,載入文字和標籤列到表格中, 其中標籤的值是三種:positive, negative 及 neutral.在WWDC 2018 Session 703 video中,展示了另一種方式來載入單獨儲存的名稱為positive和negative文字檔案的方法,類似於載入圖片到圖片分類器的方法.但它只適用於Create ML;並不適用於Turi Create.
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))
複製程式碼
回到文字分類器主程式碼中:
- 第2步,和Turi Create的 random_split() 一樣,隨機分配20%資料到testingData.可選的seed引數是用來設定隨機數生成器的種子的.
- 第3步,和Turi Create的 sentence_classifier.create() 中做的一樣.
- 第4-6步,計算訓練,驗證及評估準確率指標.
- 第7步和第8步輸出帶有後設資料的Core ML模型.
Turi Create
這些程式碼來自我們的教程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')
複製程式碼
- 第1步,和Create ML一樣,你可以從JSON或CSV檔案中載入資料.
- 第2步,訓練模型.
- 第3步,輸出Core ML模型.
在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 冒險了!
Turi Create還有其他五個任務處理工具集(task-focused toolkits)目前暫未包含在Create ML中:
- 推薦系統
- 圖片相似度
- 物體檢測
- 風格遷移
- 活動分類
貓狗的圖片看起來非常有趣,所以你將訓練一個模型來找到相似圖片.
是的,你現在需要寫點Python了.開發環境用Jupyter notebook你會感覺很熟悉 —— 它很像是一個Xcode的playground,但是執行在你的瀏覽器中.
最簡單的方式是使用Anaconda —— 它是ML社群建立的,用來整理所有版本的Python和ML庫,並在單獨的環境(environments) 中管理它們.
Anaconda & Notebooks
下載Python 3.6 version of Anaconda for macOS,在你的home directory中安裝它,不要在root目錄:
如果它說無法安裝,點選Install on a specific disk…按鈕,然後點選返回到Home按鈕 —— 就可以安裝了:注意:安裝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語法的最大不同是當你定義閉包,函式和類的時候,用縮排而不是 {...} .
建立Turi Create環境
可以使用Anaconda Navigator GUI或者終端(Terminal)命令來建立環境,來執行Turi Create程式碼.
GUI:開啟Anaconda Navigator,切換到Environments標籤頁面,並匯入starter/turienv.yaml —— 點選資料夾圖示並在Finder中設定檔案位置. Anaconda Navigator將會從檔案中填充環境名稱:
Terminal:開啟Terminal,輸入以下命令:conda env create -f <drag starter/turienv.yaml file from Finder>
複製程式碼
啟動Jupyter Notebook
在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:
一個終端視窗會開啟,以執行Jupyter伺服器,然後一個瀏覽器視窗顯示你的首頁資料夾.切換回你的notebooks資料夾. Terminal:如果你在使用Terminal,輸入下列命令以載入turienv:source activate turienv
複製程式碼
這個命令列提示符(command line prompt)現在帶有 (turienv) 啟動.輸入下面命令來在notebooks資料夾中啟動Jupyter伺服器,並顯示瀏覽器視窗:
jupyter notebook <drag notebooks folder from the Finder>
複製程式碼
訓練模型
建立一個新的Python 3.6 notebook:
雙擊標題,重新命名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()
複製程式碼
由於圖片的載入順序是不確定的,所以你的第10張圖片很可能是不一樣的.重要的是輸出應該像下面一樣.
所以,執行這幾行程式碼:
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教程中的最新篇.其它還有:
- Core ML and Vision: Machine Learning in iOS 11 Tutorial
- Beginning Machine Learning with Keras & Core ML
- Beginning Machine Learning with scikit-learn
- IBM Watson Services for Core ML Tutorial
- Natural Language Processing on iOS with Turi Create
- caffe(稍後推出).
ML社群
- Kaggle是一個由成員貢獻的資料集,一般用notebook配合來分析和視覺化資料.它執行模型預測競爭,正如下面連結中所示.
- Machine Learning Zero-to-Hero: Everything you need in order to compete on Kaggle for the first time, step-by-step!
我希望你喜歡本Create ML教程,如果你有任何問題或意見,請在下面評論.特別是記得告訴我們你用Create ML和Turi Create做什麼!
本文資料下載