什么是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(); } } }
通過上面的示例代碼我們非常簡單了解了如何來使用模型,僅需傳入圖片路徑,即可使用模型輸出對應的圖像標簽(男、女)和准確性,我們可以運行起來,執行結果如下所示:

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