آموزش ML.NET در 10 دقیقه

در پست قبل توضیحی در مورد ML.NET  دادم که ML  مخفف Machine Learning و .NET  که همون فریمورک .net  خودمان هست و کارش هم آموزش ماشین در .net  با استفاده از c# و یا f#

چون چندسکویی هست از دستورات CLI  استفاده کرده و من هم برای همین از VS Code  استفاده میکنم که این دستورا را در بخش Terminal  مینویسم.

 بریم سر اصل مطلب اول باید SDK .NET را دانلود کنید اگر ویژوال استادیو دارین که لازم نیست. بعد میایم پروژه Console  میسازیم

توی ترمینال مینویسیم

dotnet new console -o myApp
cd myApp

دستور dotnet یک  اپلیکیشن new از نوع console میسازد و پارامتر -o یک دایرکتوری با نام myApp مسازده و فایل ها را درون آن ذخیره میکند و با cd myApp  هم وارد دایرکتوری myApp  میشویم (cd = change directory)

حالا نوبت به نصب پکیج ML.NET میرسد برای این کار دستور زیر را در ترمینال (command prompt) مینویسیم

dotnet add package Microsoft.ML --version 0.8.0

دانلود data set

در-machine learning app شما نوعی از iris flower (setosa, versicolor, or virginica)  بر اساس چهار ویژگی : petal length (طول گلبرگ), petal width(عرض گلبرگ),(طول ساقه) sepal length, و (عرض ساقه)sepal width پیشبینی خواهد کرد.

این-UCI Machine Learning Repository: Iris Data Set, بازکنید و داخل یک تکسک ادیتور مثل notepad  کپی و پیست کنید و در دایرکتوری  myApp  با نام  iris-data.txt  ذخیره کنید.

وقتی پیست میکنید داده ها به صورت زیر نمایش داده میشود. هر سطر  نشان دهنده یک نمونه مختلف از یک iris flower می باشد. از چپ به راست، ستون نشان دهنده  طول ساقه (sepal length) ، عرض ساقه (sepal width) ، طول گلبرگ (petal length) ، عرض گلبرگ (petal width)  و نوع iris flower

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
...

اگر از ویژوال استادیو استفاده میکنید باید پیکربندی فایل iris-data.txt به دایرکتوری خروجی کپی می شود.

نوشتن کد

فایل Program.cs  باز کنید و کد زیر درون آن جایگزین کنید:

using Microsoft.ML;
using Microsoft.ML.Runtime.Api;using Microsoft.ML.Runtime.Data;using Microsoft.ML.Runtime.Learners;using Microsoft.ML.Transforms.Conversions;using System;

namespace myApp{class Program{// STEP 1: Define your data structures// IrisData is used to provide training data, and as// input for prediction operations// - First 4 properties are inputs/features used to predict the label// - Label is what you are predicting, and is only set when trainingpublic class IrisData{public float SepalLength;public float SepalWidth;public float PetalLength;public float PetalWidth;public string Label;}

// IrisPrediction is the result returned from prediction operationspublic class IrisPrediction{[ColumnName("PredictedLabel")]public string PredictedLabels;}

static void Main(string[] args){// STEP 2: Create a ML.NET environmentvar mlContext = new MLContext();

// If working in Visual Studio, make sure the 'Copy to Output Directory'// property of iris-data.txt is set to 'Copy always'string dataPath = "iris-data.txt";var reader = mlContext.Data.TextReader(new TextLoader.Arguments(){Separator = ",",HasHeader = true,Column = new[]{new TextLoader.Column("SepalLength", DataKind.R4, 0),new TextLoader.Column("SepalWidth", DataKind.R4, 1),new TextLoader.Column("PetalLength", DataKind.R4, 2),new TextLoader.Column("PetalWidth", DataKind.R4, 3),new TextLoader.Column("Label", DataKind.Text, 4)}});IDataView trainingDataView = reader.Read(new MultiFileSource(dataPath));

// STEP 3: Transform your data and add a learner// Assign numeric values to text in the "Label" column, because only// numbers can be processed during model training.// Add a learning algorithm to the pipeline. e.g.(What type of iris is this?)// Convert the Label back into original text (after converting to number in step 3)var pipeline = mlContext.Transforms.Conversion.MapValueToKey("Label").Append(mlContext.Transforms.Concatenate("Features", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")).Append(mlContext.MulticlassClassification.Trainers.StochasticDualCoordinateAscent(labelColumn: "Label", featureColumn: "Features")).Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

// STEP 4: Train your model based on the data setvar model = pipeline.Fit(trainingDataView);

// STEP 5: Use your model to make a prediction// You can change these numbers to test different predictionsvar prediction = model.MakePredictionFunction<IrisData, IrisPrediction>(mlContext).Predict(new IrisData(){SepalLength = 3.3f,SepalWidth = 1.6f,PetalLength = 0.2f,PetalWidth = 5.1f,});

Console.WriteLine($"Predicted flower type is: {prediction.PredictedLabels}");}}}

اپ-app  را اجرا کنید

درون command prompt  یا terminal دستور زیر را اجرا کنید

dotnet run

آخرین خط خروجی نوع پیش بینی گلرنگ است. شما می توانید مقادیر منتقل شده به تابع Predict  را برای دیدن پیش بینی ها بر اساس اندازه گیری های مختلف تغییر دهید.

تبریک می گوییم، شما اولین مدل یادگیری ماشین خود را با ML.NET ساخته اید!

نوشتن ML.NET 5 مرحله دارد

مرحله 1: ساختارهای داده خود را تعریف کنیدIrisData برای ارائه داده های آموزشی استفاده می شود و به عنوانورودی برای عملیات پیش بینیچهار پراپرتی اول ورودی/ویژگی مورد استفاده برای پیشبینی برچسب استlable چیزی است که شما پیش بینی می کنید و تنها زمانی تنظیم می شوید که تمرین می کنید

IrisPrediction نتیجه برگشتی از عملیات پیش بینی

مرحله دوم : ساخت یک محیط ML.NET

اگر با ویژوال استودیو کار میکنید ، حتما مطمئن شوید که 'Copy to Output Directory'
پراپرتی فایل iris-data.txt روی 'Copy always' ست شده باشد






مرحله 3 : تبدیل داده شما و اضافه کردن یک یادگیرنده --- داده های خود را تبدیل کرده و یادگیرنده را اضافه کنید
مقادیر عددی را به متن در ستون "Label" اختصاص دهید،فقط بخطر
اعداد را می توان در حین آموزش مدل پردازش کرد
الگوریتم یادگیری را به خط لوله اضافه کنید.به عنوان مثال (این کدام نوع iris است؟)
تبدیل برچسب به متن اصلی (پس از تبدیل به شماره در مرحله 3)




مرحله 4: آموزش مدل خود را بر اساس مجموعه داده




مرحله5: برای پیش بینی از مدل خود استفاده کنید
 شما می توانید این اعداد را برای تست پیش بینی های مختلف تغییر دهید




البته تغییرات زیادی کرده تا آنجایی که داکیومنت های ماکروسافت/میکروسافت با مثال هایش همخوانی نداشت ! بنظرمن تا انتشار نسخه نهایی آن دست نگهدارید.