一提到機器學習,老是讓人望而生畏。幸運的是,Azure正在千方百計讓開發人員更容易進入機器學習。ML.NET是Microsoft Research專爲.NET開發人員開發的機器學習框架,所以您能夠在Visual Studio中完成全部工做。若是你尚未玩過它,我想你會愛上它。當您準備好部署ML.NET算法時,您能夠經過Azure Function使用無服務器架構- 而沒必要擔憂運行時會把服務器和容器弄得一團糟。html
受到Luis Quintanilla的文章啓發,有關ML.NET與Azure Function,咱們嘗試把兩者結合起來使用。您將在本地使用ML.NET來訓練您的機器學習模型。而後,您將建立一個Azure環境,其中包含存儲賬戶和Azure Function,以託管您的機器學習應用程序。使用您的模型構建應用程序的最後一步將在下一篇文章中介紹。git
對於這個快速項目的ML.NET部分,讓咱們從ML.NET10分鐘入門教程中構建鳶尾花分類模型。做爲先決條件,您須要安裝Azure CLI 2.0, Azure Function Core Tools和最新版本的.NET Core。github
打開命令提示符併爲ML.NET項目建立一個新文件夾。算法
> mkdir demo > cd demo
接下來,建立一個新的解決方案以及一個新的控制檯項目並安裝ML.NET包。shell
> dotnet new solution > dotnet new console -o model > dotnet sln add model/model.csproj > cd model > dotnet add package Microsoft.ML --version 0.4.0 > dotnet restore
在模型下建立數據目錄。bash
> mkdir data
打開UCI機器學習庫:Iris數據集,將數據複製並粘貼到VS Code或TextEdit或Notepad中,並將其保存爲數據目錄中的iris-data.txt。如今是時候寫一些代碼了。在Visual Studio Code中打開項目並建立幾個數據結構類:IrisData.cs和IrisPrediction.cs。服務器
using Microsoft.ML.Runtime.Api; public class IrisData { [Column("0")] public float SepalLength; [Column("1")] public float SepalWidth; [Column("2")] public float PetalLength; [Column("3")] public float PetalWidth; [Column("4")] [ColumnName("Label")] public string Label; } public class IrisPrediction { [ColumnName("PredictedLabel")] public string PredictedLabels; }
添加模型類以執行機器學習訓練。數據結構
using System.Threading.Tasks; using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Trainers; using Microsoft.ML.Transforms; class Model { public static async Task<PredictionModel<IrisData, IrisPrediction>> Train(LearningPipeline pipeline, string dataPath, string modelPath) { // Load Data pipeline.Add(new TextLoader(dataPath).CreateFrom<IrisData>(separator: ',')); // Transform Data // Assign numeric values to text in the "Label" column, because // only numbers can be processed during model training pipeline.Add(new Dictionarizer("Label")); // Vectorize Features pipeline.Add(new ColumnConcatenator("Features", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")); // Add Learner pipeline.Add(new StochasticDualCoordinateAscentClassifier()); // Convert Label back to text pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" }); // Train Model var model = pipeline.Train<IrisData, IrisPrediction>(); // Persist Model await model.WriteAsync(modelPath); return model; } }
將您的邏輯放在Program.cs文件中以運行該過程:架構
class Program { static void Main(string[] args) { string dataPath = "/Users/mbcrump/Documents/demo/model/data/iris-data.txt"; string modelPath = "/Users/mbcrump/Documents/demo/model/model.zip"; var model = Model.Train(new LearningPipeline(), dataPath, modelPath).Result; // Test data for prediction var prediction = model.Predict(new IrisData() { SepalLength = 3.3f, SepalWidth = 1.6f, PetalLength = 0.2f, PetalWidth = 5.1f }); Console.WriteLine($"Predicted flower type is: {prediction.PredictedLabels}"); } }
運行模型項目以在根目錄中建立新的model.zip文件。如下是我獲得的結果。app
Michaels-MacBook-Pro:model mbcrump$ dotnet run Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off. Using 4 threads to train. Automatically choosing a check frequency of 4. Auto-tuning parameters: maxIterations = 9996. Auto-tuning parameters: L2 = 2.668802E-05. Auto-tuning parameters: L1Threshold (L1/L2) = 0. Using best model from iteration 500. Not training a calibrator because it is not needed. Predicted flower type is: Iris-virginica
恭喜!您已經使用ML.NET對機器學習模型進行了培訓,對鳶尾花進行了分類。
咱們將使用Azure Cloud Shell,它使用Azure CLI來設置咱們的Azure環境。最簡單的方法是登陸Azure門戶賬戶,而後單擊下面顯示的Cloud Shell圖標以打開bash shell或轉到shell.azure.com。
登陸後,在bash shell中爲此項目建立一個新資源組(並用您本身的一個替換「mlnetdemo」以及該位置)。
$ az group create --name mlnetdemo --location westus
將存儲添加到此資源組。
注意:您必須將如下名稱更改成惟一的名稱
$ az storage account create --name mlnetdemostorage --location westus --resource-group mlnetdemo --sku Standard_LRS
建立Azure Function並將其配置爲使用支持.NET Core的beta運行時。
注意:您必須將如下名稱更改成惟一的名稱
$ az functionapp create --name mlnetdemoazfunction1 --storage-account mlnetdemostorage1 --consumption-plan-location westus --resource-group mlnetdemo
$ az functionapp config appsettings set --name mlnetdemoazfunction1 --resource-group mlnetdemo --settings FUNCTIONS_EXTENSION_VERSION=beta
要將模型部署到服務器,您須要獲取存儲賬戶的密鑰。在bash窗口中使用如下命令來獲取它。
$ az storage account keys list --account-name mlnetdemostorage1 --resource-group mlnetdemo
你會看到如下內容:
[ { "keyName": "key1", "permissions": "Full", "value": "YOURKEY" }, { "keyName": "key2", "permissions": "Full", "value": "NONEYOBUSINESS" } ]
使用如下命令基於您的賬戶密鑰建立一個名爲models的新目錄,用於
放入模型(能夠在設置|訪問鍵下的導航窗口中找到)。
$ az storage container create --name models --account-key YOURKEY --account-name mlnetdemostorage1
因爲咱們使用的是Cloud Shell,所以在此步驟中使用Azure Portal會更容易。若是您願意,也能夠使用Azure CLI。瀏覽到您的mlnetdemo資源組版本,並深刻查看您以前建立的存儲資源。以這些blob進行訓練前,您會看到models文件
夾下新的子目錄,在硬盤上找到model.zip上傳到這裏。
在第2部分中,咱們將介紹構建由Azure Function託管的應用程序,該應用程序將針對您的鳶尾花圖像進行分類。