什麼是ML.NET?
ML.NET 使你能夠在聯機或離線場景中將機器學習新增到 .NET 應用程式中。 藉助此功能,可以使用應用程式的可用資料進行自動預測。 機器學習應用程式利用資料中的模式來進行預測,而不需要進行顯式程式設計。
ML.NET 的核心是機器學習模型 。 該模型指定將輸入資料轉換為預測所需的步驟。 藉助 ML.NET,可以通過指定演算法來訓練自定義模型,也可以匯入預訓練的 TensorFlow 和 ONNX 模型。
ML.NET 支援在使用 .NET Core 的 Windows、Linux 和 macOS 或使用 .NET Framework 的 Windows 上執行。 所有平臺均支援 64 位。 Windows 支援 32 位,TensorFlow、LightGBM 和 ONNX 相關功能除外。
瞭解ML.NET模型生成器
ML.NET 模型生成器是一個直觀的圖形化 Visual Studio 擴充套件,用於生成、訓練和部署自定義機器學習模型。其使用自動化的機器學習 (AutoML) 來探索不同的機器學習演算法和設定,以幫助找到最合適的方案。
使用模型生成器不需要具備機器學習的專業知識。 只需要一些資料,和確定要解決的問題。 模型生成器會生成將模型新增到 .NET 應用程式的程式碼。
值得注意的是,目前ML.NET 模型生成器是屬於預覽版,需要先啟用此預覽功能:

接下來,我們將使用此模型生成器來生成圖片性別生成的程式碼。
生成圖片性別識別的程式碼
主體步驟如下所示:
1.建立控制檯專案,然後新增【機器學習】

2.選擇方案,這裡我們選擇【影像分類】
當完成了第一步操作之後,我們將開啟ML.NET模型生成器的UI介面。這裡我們選擇【影像分類】方案:

3.選擇訓練環境

4.新增資料
在此之前,我們需要先準備好資料。由於是做圖片分類,我們需要先準備圖片資料,並且以資料夾的形式分類,比如:


準備好圖片資料後,我們就可以在【資料】介面新增對應的資料夾了:

新增完成後,就可以看到【資料預覽】:

這裡筆者準備了5000多張學生圖片,由於涉及隱私,這些資料樣本不會公開,如需要訓練可以去國外很多AI網站下載資料樣本。
5.訓練
訓練是一個自動的過程,模型生成器通過該過程教模型如何回答方案相關的問題。 訓練後,模型可以對其沒有見過的輸入資料進行預測。 例如,在預測房價時,可以預測新上市的房屋銷售價。因為模型生成器使用自動機器學習 (AutoML),所以在訓練期間不需要任何人工輸入或微調操作。

接下來,我們【開始訓練】:

一般500M資料需要訓練大概半小時以上(具體還需視機器效能而定):

6.評估
訓練結束後,我們就可以開始評估了。評估是衡量模型品質的過程。下面97.08的準確性已經是效能非常好的模型了,高於50%的準確性才是可以接受的模型。

如果模型效能評分不符合預期,可以:
- 延長訓練時間。 有了更多時間,自動機器學習引擎可以體驗更多演算法和設定。
- 新增更多更精確的資料。 有時,資料量不足以訓練高質量的機器學習模型。對於包含少量示例的資料集,尤其如此。
- 均衡分配資料。 對於分類任務,請確保在各個類別間均勻分配訓練集。 例如,若有四個類別和 100 個訓練示例,前兩類(標記 1 和標記 2)包含 90 個記錄,而剩下兩類(標記 3 和標記 4)只包含 10 個記錄,這就存在資料不均衡的問題,可能會導致模型很難正確預測標記 3 或標記 4。
回到剛才的主題,我們可以試用剛訓練出的模型。這裡筆者找了幾張資料樣本之外的圖片進行測試:


模型的準確性非常之高,我們用一張偏女性化的男性圖片進行測試:

從上面的測試結果可以看出,準確性基本上取決於資料樣本的數量和質量!
7.新增程式碼
完成評估階段後,模型生成器可以輸出一份模型檔案和程式碼,我們可以使用該程式碼將模型新增到應用程式。 ML.NET 模型儲存為 zip 檔案。 用於載入和使用模型的程式碼會以新專案的形式新增到解決方案中。 模型生成器還會新增一個示例控制檯應用,可以執行該應用來檢視工作狀態下的模型。
此外,模型生成器還會輸出生成模型的程式碼,以便你能瞭解生成模型所使用的步驟。 還可以通過模型訓練程式碼使用新的資料重新訓練模型。新增程式碼如下所示:

【新增】之後,在解決方案中我們就可以相關程式碼了:

如上圖所示,ML.NET模型的zip檔案也包含在解決方案中。
執行示例程式碼
我們將【GenderRecognitionML.ConsoleApp】工程設定為啟動專案,開啟示例程式碼如下所示:
using System; using GenderRecognitionML.Model; namespace GenderRecognitionML.ConsoleApp { class Program { static void Main(string[] args) { // Create single instance of sample data from first line of dataset for model input ModelInput sampleData = new ModelInput() { ImageSource = @"D:\workspace\AI\GenderRecognition\資料樣本\女\20200612180307_xxx.jpg", }; // Make a single prediction on the sample data and print results var predictionResult = ConsumeModel.Predict(sampleData); Console.WriteLine("Using model to make single prediction -- Comparing actual Label with predicted Label from sample data...\n\n"); Console.WriteLine($"ImageSource: {sampleData.ImageSource}"); Console.WriteLine($"\n\nPredicted Label value {predictionResult.Prediction} \nPredicted Label scores: [{String.Join(",", predictionResult.Score)}]\n\n"); Console.WriteLine("=============== End of process, hit any key to finish ==============="); Console.ReadKey(); } } }
通過上面的示例程式碼我們非常簡單瞭解瞭如何來使用模型,僅需傳入圖片路徑,即可使用模型輸出對應的影像標籤(男、女)和準確性,我們可以執行起來,執行結果如下所示:

至此,整個教程就完成了,是不是非常簡單呢?即使我們不具備機器學習的專業知識!