使用ML.NET和Azure Function進行機器學習 - 第1部分

介紹

一提到機器學習,老是讓人望而生畏。幸運的是,Azure正在千方百計讓開發人員更容易進入機器學習。ML.NET是Microsoft Research專爲.NET開發人員開發的機器學習框架,所以您能夠在Visual Studio中完成全部工做。若是你尚未玩過它,我想你會愛上它。當您準備好部署ML.NET算法時,您能夠經過Azure Function使用無服務器架構- 而沒必要擔憂運行時會把服務器和容器弄得一團糟。html

無服務器機器學習

受到Luis Quintanilla的文章啓發,有關ML.NETAzure Function,咱們嘗試把兩者結合起來使用。您將在本地使用ML.NET來訓練您的機器學習模型。而後,您將建立一個Azure環境,其中包含存儲賬戶和Azure Function,以託管您的機器學習應用程序。使用您的模型構建應用程序的最後一步將在下一篇文章中介紹。git

建立您的模型

對於這個快速項目的ML.NET部分,讓咱們從ML.NET10分鐘入門教程構建鳶尾花分類模型做爲先決條件,您須要安裝Azure CLI 2.0, Azure Function Core Tools和最新版本的.NET Coregithub

 

打開命令提示符併爲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.csIrisPrediction.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對機器學習模型進行了培訓,對鳶尾花進行了分類。

使用Cloud Shell設置Azure環境

咱們將使用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託管的應用程序,該應用程序將針對您的鳶尾花圖像進行分類。

相關文章
相關標籤/搜索