版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.08.17 |
前言
目前世界上科技界的所有大佬一致認為人工智能是下一代科技革命,蘋果作為科技界的巨頭,當然也會緊跟新的科技革命的步伐,其中ios API 就新出了一個框架
Core ML
。ML是Machine Learning
的縮寫,也就是機器學習,這正是現在很火的一個技術,它也是人工智能最核心的內容。感興趣的可以看我寫的下面幾篇。
1. Core ML框架詳細解析(一) —— Core ML基本概覽
2. Core ML框架詳細解析(二) —— 獲取模型并集成到APP中
3. Core ML框架詳細解析(三) —— 利用Vision和Core ML對圖像進行分類
4. Core ML框架詳細解析(四) —— 將訓練模型轉化為Core ML
5. Core ML框架詳細解析(五) —— 一個Core ML簡單示例(一)
Using the Image Classifier - 使用圖像分類器
Create ML GUI
導出Core ML
模型,然后您只需將模型拖到舊的Core ML項目中,在代碼中更改一個單詞,就可以了!
單擊ImageClassifier
旁邊的顯示符號以查看不同的選項集。 單擊文本,然后將其更改為PetsClassifier
。 將Where
位置更改為starter
文件夾,然后單擊Save
:
在starter
文件夾中打開ClassificationImagesWithVisionAndCoreML
項目。 這是Apple的2017年項目:我已將其更新為Swift 4.2,并修復了照片選擇器調用。 它使用MobileNet.mlmodel
,它是17.1 MB:
將PetsClassifier.mlmodel
拖到項目導航器中。 它是17 KB:
在項目中搜索MobileNet
:
在let model
code語句中,將MobileNet
替換為PetsClassifier
:
let model = try VNCoreMLModel(for: PetsClassifier().model)
Build并運行。 單擊相機圖標以打開照片選取器,然后將一些狗和貓圖像拖入Photos
:
選一個,應用程序通過顯示每個標簽的概率將其分類為狗或貓:
Turi Create Image Classifier - Turi Create圖像分類器
以下是同一數據集的Turi Create image classifier example中的代碼 - 完整的25,000圖像數據集:
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對應于創建Training和Testing文件夾,然后將Training文件夾拖到視圖上。 Turi Create必須從圖像的路徑中提取類標簽,但步驟3隨機地將20%的數據集分配給
test_data
,這樣可以節省創建Training和Testing文件夾的工作,并且每次運行這段代碼都可以獲得不同的測試數據集。
注意:在第2步中,僅為兩個類提取類標簽是一種特殊情況。 我在上面的代碼中添加了一個注釋,以顯示更一般的情況。 首先,
os.path.split()
將路徑分成兩部分:文件的名稱(如42.jpg)以及導致它的所有內容。 然后os.path.basename()
是最后一個文件夾的名稱,它是具有類名的文件夾。
步驟5和6對應于將Testing文件夾拖到視圖上。 Jupyter筆記本可以像
Create ML
視圖一樣輕松地顯示predictions
數組。 您還可以過濾數組以查找錯誤的分類,而不是滾動測試圖像。步驟7保存模型供以后使用,因此您可以再次加載它并在不同的測試數據集上運行它。
步驟8導出
Core ML
模型。
所以Turi Create
的圖像分類更加手動,但比Create ML
更靈活。 turicreate.create()
documentation列出了幾個可選參數。 您可以指定基礎model
以匹配Create ML。 請注意Core ML型號的尺寸差異! 如果您創建了一個真正代表您的真實測試數據并且不希望模型使用您的訓練數據中的隨機選擇,您還可以提供固定的validation_set
。
圖像分類是Create ML
中的一個非常特殊的情況:MLImageClassifierBuilder GUI
消除了編寫代碼的需要和機會。 在下一節中,您將看到其他Create ML模型也需要更多代碼。
Text Classifier - 文本分類器
現在比較Create ML和Turi Create如何訓練并測試文本分類器模型。 Turi Create模型需要將測試文本轉換為一個單詞包 - 這是一個直接的轉換,它內置于Create ML模型中,因此它直接接受測試文本。
1. Create ML
這里是代碼Create ML text classifier example
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)步驟1將數據加載到包含文本text和標簽label列的表中,其中label的值為正,負或中性。 WWDC 2018 Session 703 video視頻顯示了另一種使用單獨文本文件在
positive
和negative
命名的文件夾中加載文本數據的方法,類似于加載圖像以訓練圖像分類器的方式。 這是Create ML中的一個特殊功能,它在Turi Create
中不可用。
從WWDC 2018 Session 703
加載labeled文本數據的替代方法:
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)第2步與
Turi Create
的random_split()
相同,隨機地將20%的數據分配給testingData
。 可選的seed
參數設置隨機數生成器的seed
。 - 3)第3步與Turi Create的
sentence_classifier.create()
相同。 - 4 ~ 6)步驟4-6計算訓練,驗證和評估準確度指標。
- 7 ~ 8)步驟7和8使用一些元數據導出Core ML模型。
2. 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)第1步:與
Create ML
一樣,您可以從JSON或CSV文件加載數據。 - 2)第2步訓練模型。
- 3)步驟3導出Core ML模型。
Turi Create
教程材料包括一個iOS應用程序,您可以在其中測試粘貼到textview中的文本的模型。 該應用程序使用wordCounts(text :)
輔助函數,類似于 Turi Create text classification example底部的單詞函數包。
Turi Create文本分類器期望以單詞和單詞計數字典的形式輸入。 Create ML文本分類器直接接受文本輸入,并創建自己的單詞包。
Turi Create Image Similarity - Turi Create圖像相似度
現在深吸一口氣 - 你正在進行Turi Create
冒險!
Turi Create
有五個以任務為中心的工具包。
- 推薦系統
- 圖像相似度
- 物體檢測
- 風格轉移
- 活動分類
看貓狗圖片很有趣,所以你會訓練模型找到類似的圖像。
是的,你需要編寫一些Python。 感覺最熟悉的開發環境是Jupyter筆記本 - 它就像一個Xcode playground,但它在你的瀏覽器中運行。
最簡單的方法是使用Anaconda
- 由ML社區創建,以整理所有版本的Python和ML庫,并在不同的環境中管理它們。
Anaconda & Notebooks
下載Python 3.6 version of Anaconda for macOS,在home directory
中安裝而不是在根目錄文件夾中安裝。
如果顯示您無法在那里安裝它,請單擊Install on a specific disk…
按鈕,然后單擊返回到Home
按鈕 - 它應該更加令人滿意:
注意:安裝
Anaconda
并創建Turi Create環境可能需要幾分鐘時間。 在您等待的同時,瀏覽Michael Kennedy 2014年11月的Comparison of Python and Swift Syntax以及Jason Brownlee 2016年5月的 Crash Course in Python for Machine Learning Developers。 Brownlee的文章包括使用數據科學庫NumPy
,Matplotlib
和Pandas
的例子。 Swift和Python語法之間的最大區別在于您使用縮進而不是{...}
來定義閉包,函數和類。
1. Create Turi Create Environment - 創建Turi Create環境
使用Anaconda Navigator GUI
或Terminal
命令創建一個可以運行Turi Create代碼的環境。
GUI:打開Anaconda Navigator
,切換到Environments
選項卡,然后導入starter / turienv.yaml
- 只需單擊文件夾圖標,然后在Finder中找到該文件。 Anaconda Navigator
將從文件中填寫環境名稱:
Terminal: 打開終端并輸入以下命令:
conda env create -f <drag starter/turienv.yaml file from Finder>
2. Launch Jupyter Notebook
使用GUI或終端命令在turienv
環境中啟動Jupyter筆記本。
首先,在Finder
中,創建一個名為notebooks
的本地文件夾。
如果你有一個非常強大的新Mac,下載并取消歸檔 Kaggle Cats and Dogs Dataset,然后將PetImages
文件夾移動到notebooks
中,這樣你就可以輕松地將它加載到你即將創建的筆記本中。
完整的Kaggle數據集包含25,000張圖像,這需要很長時間才能在較舊的Mac上處理。 您可以隨意使用Pets-1000
文件夾,也可以創建自己的數據集。
GUI:如果您正在使用Anaconda Navigator
,請切換到Home選項卡,檢查turienv
是否出現在Applications on
字段中,然后單擊jupyter Launch
:
將打開一個終端窗口以運行Jupyter服務器,然后瀏覽器窗口將顯示您的主目錄。 導航到您的notebooks
文件夾。
終端:如果您正在使用終端,請輸入此命令以加載turienv
:
source activate turienv
命令行提示現在以(turienv)
開頭。 輸入此命令以啟動notebooks
文件夾中的Jupyter服務器,并顯示瀏覽器窗口:
jupyter notebook <drag notebooks folder from the Finder>
Training the Model - 訓練模型
創建一個新的Python 3.6 notebook
:
雙擊標題以重命名筆記本:
注意:此示例與Apple的 Image similarity示例相同,但使用Cat和Dog數據集。
notebook包含一個空單元格。 在單元格中鍵入此行,然后按Shift-Enter
運行單元格:
import turicreate as tc
注意:如果您只想運行一個代碼語句,
Shift-Enter
也適用于Xcode playgrounds。
第一個下面出現了一個新的空單元格。 在其中鍵入以下內容,然后運行它:
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,path和image列。 將光標懸停在一行中會顯示圖像:
下面,運行下面語句:
model = tc.image_similarity.create(reference_data)
這將需要一段時間 - In [*]
中顯示它正在運行。 在您等待的同時,請閱讀有關unsupervised learning
的內容。
注意:要在單元格完成之前停止單元格,請單擊
Stop
按鈕(工具欄中的Run
旁邊)。 隨意刪除PetImages
中的圖像,或者只是加載Pets-1000
。
Unsupervised Learning - 無監督學習
向圖像分類器提供標記數據使其能夠通過檢查其對標簽的預測來測量其準確度。 這是有監督的學習supervised learning
。
雖然您為此圖像相似性訓練器提供了相同的標記數據集,但它不使用標簽:此模型使用無監督學習。 底層模型查看了大量圖像,并自學了哪些像素值排列構成了可用于聚類“相似”圖像的特征。 因此,就像圖像分類器一樣,大部分訓練時間用于從數據集中提取這些特征。 然后它做"brute force"
nearest neighbors:對于每個圖像,它計算它與每個其他圖像的距離,并將其他圖像排列成半徑帶。 同樣,與特征提取相比,這一步驟很快。
Querying the Model - 查詢模型
模型準備好以后就運行下面這行代碼:
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()
目標圖像實際上是返回的第一個圖像。 其他圖像顯示看起來相似和/或以類似方式定位位置不同的貓。
Shutting Down
退出jupyter
瀏覽器窗口。
在運行jupyter
服務器的終端窗口中,按Control-C-C
以停止服務器。
如果命令行提示符以(turienv)
開頭,請輸入以下命令退出:
source deactivate
如果您真的不想保留Anaconda
,請輸入以下命令:
rm -rf ~/anaconda3
關于本文章的內容就此結束了,下面說一下其他方面的。
探索Create ML及其文檔,但也花一些時間瀏覽Turi Create User Guide,即使您不想編寫Python。
后記
本篇主要講述了一個Core ML簡單示例,感興趣的給個贊或者關注~~~