Előrejelzések készítése AutoML ONNX-modellel a .NET-ben
Ebből a cikkből megtudhatja, hogyan használhat automatizált ML (AutoML) nyílt neurális hálózati exchange -modellt (ONNX) egy C#-konzolalkalmazás előrejelzéseihez ML.NET.
ML.NET egy nyílt forráskódú, platformfüggetlen gépi tanulási keretrendszer a .NET-ökoszisztémához, amely lehetővé teszi egyéni gépi tanulási modellek betanítását és használatát a C# vagy az F# kódelső megközelítésével, vagy alacsony kódszámú eszközökkel, például a Model Builderrel és a ML.NET CLI-vel. A keretrendszer bővíthető, és lehetővé teszi más népszerű gépi tanulási keretrendszerek, például a TensorFlow és az ONNX kihasználását.
Az ONNX egy nyílt forráskódú formátum az AI-modellekhez. Az ONNX támogatja a keretrendszerek közötti interoperabilitást. Ez azt jelenti, hogy betaníthat egy modellt a számos népszerű gépi tanulási keretrendszer, például a PyTorch egyikében, átalakíthatja ONNX formátumba, és felhasználhatja az ONNX-modellt egy másik keretrendszerben, például ML.NET. További információért látogasson el az ONNX webhelyére.
Előfeltételek
- .NET 6 SDK vagy újabb
- Szövegszerkesztő vagy IDE (például Visual Studio vagy Visual Studio Code)
- ONNX-modell. Az AutoML ONNX-modellek betanítása a következő banki marketingbesorolási jegyzetfüzetben olvasható.
- Netron (nem kötelező)
C#-konzolalkalmazás létrehozása
Ebben a példában a .NET CLI használatával hozza létre az alkalmazást, de ugyanezeket a feladatokat a Visual Studióval is elvégezheti. További információ a .NET parancssori felületéről.
Nyisson meg egy terminált, és hozzon létre egy új C# .NET-konzolalkalmazást. Ebben a példában az alkalmazás neve .
AutoMLONNXConsoleApp
A címtárat ugyanaz a név hozza létre az alkalmazás tartalmával.dotnet new console -o AutoMLONNXConsoleApp
A terminálban keresse meg az AutoMLONNXConsoleApp könyvtárat.
cd AutoMLONNXConsoleApp
Szoftvercsomagok hozzáadása
Telepítse a Microsoft.ML, a Microsoft.ML.OnnxRuntime és a Microsoft.ML.OnnxTransformer NuGet csomagokat a .NET CLI használatával.
dotnet add package Microsoft.ML dotnet add package Microsoft.ML.OnnxRuntime dotnet add package Microsoft.ML.OnnxTransformer
Ezek a csomagok tartalmazzák azokat a függőségeket, amelyek az ONNX-modellek .NET-alkalmazásokban való használatához szükségesek. ML.NET biztosít egy API-t, amely az ONNX-futtatókörnyezetet használja az előrejelzésekhez.
Nyissa meg a Program.cs fájlt, és adja hozzá a következő
using
irányelveket felül.using System.Linq; using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms.Onnx;
Hivatkozás hozzáadása az ONNX-modellhez
Az ONNX-modell elérésének egyik módja, ha hozzáadja a konzolalkalmazást a build kimeneti könyvtárához. Ha még nem rendelkezik modellel, kövesse ezt a jegyzetfüzetet egy példamodell létrehozásához.
Adjon hozzá egy hivatkozást az ONNX-modellfájlhoz az alkalmazásban:
Másolja az ONNX-modellt az alkalmazás AutoMLONNXConsoleApp gyökérkönyvtárába.
Nyissa meg az AutoMLONNXConsoleApp.csproj fájlt, és adja hozzá a következő tartalmat a
Project
csomóponton belül.<ItemGroup> <None Include="automl-model.onnx"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
Ebben az esetben az ONNX-modellfájl neve automl-model.onnx.
(Az MSBuild gyakori elemeiről aMSBuild útmutató.)
Nyissa meg a Program.cs fájlt, és adja hozzá a következő sort az
Program
osztályba.static string ONNX_MODEL_PATH = "automl-model.onnx";
MLContext inicializálása
Main
Az osztály metódusán Program
belül hozzon létre egy új példányt.MLContext
MLContext mlContext = new MLContext();
Az MLContext
osztály az összes ML.NET művelet kiindulópontja, és az inicializálás mlContext
új ML.NET környezetet hoz létre, amely megosztható a modell életciklusában. Ez fogalmilag hasonló az Entity Frameworkhez DbContext .
A modell adatséma definiálása
A modell a bemeneti és kimeneti adatokat egy adott formátumban várja. ML.NET lehetővé teszi az adatok formátumának osztályokon keresztüli meghatározását. Néha előfordulhat, hogy már tudja, hogyan néz ki ez a formátum. Ha nem ismeri az adatformátumot, a Netronhoz hasonló eszközökkel megvizsgálhatja az ONNX-modellt.
A mintában használt modell az NYC TLC Taxi Trip adatkészlet adatait használja. Az adatok mintája az alábbi táblázatban látható:
vendor_id | rate_code | passenger_count | trip_time_in_secs | trip_distance | payment_type | fare_amount |
---|---|---|---|---|---|---|
VTS | 0 | 0 | 1140 | 3.75 | CRD | 15,5 |
VTS | 0 | 0 | 480 | 2.72 | CRD | 10,0 |
VTS | 0 | 0 | 1680 | 7,8 | CSH | 26,5 |
Az ONNX-modell vizsgálata (nem kötelező)
A Netronhoz hasonló eszközzel vizsgálhatja meg a modell bemeneteit és kimeneteit.
Nyissa meg Netront.
A felső menüsávon válassza a Fájl > megnyitása lehetőséget, és a fájlböngészővel válassza ki a modellt.
Megnyílik a modell. Az automl-model.onnx modell struktúrája például a következőképpen néz ki:
Válassza ki a diagram alján található utolsó csomópontot (
variable_out1
ebben az esetben) a modell metaadatainak megjelenítéséhez. Az oldalsáv bemenetei és kimenetei a modell várt bemeneteit, kimeneteit és adattípusait jelenítik meg. Ezen információk segítségével meghatározhatja a modell bemeneti és kimeneti sémáját.
Modellbemeneti séma definiálása
Hozzon létre egy új osztályt OnnxInput
az alábbi tulajdonságokkal a Program.cs fájlban.
public class OnnxInput
{
[ColumnName("vendor_id")]
public string VendorId { get; set; }
[ColumnName("rate_code"),OnnxMapType(typeof(Int64),typeof(Single))]
public Int64 RateCode { get; set; }
[ColumnName("passenger_count"), OnnxMapType(typeof(Int64), typeof(Single))]
public Int64 PassengerCount { get; set; }
[ColumnName("trip_time_in_secs"), OnnxMapType(typeof(Int64), typeof(Single))]
public Int64 TripTimeInSecs { get; set; }
[ColumnName("trip_distance")]
public float TripDistance { get; set; }
[ColumnName("payment_type")]
public string PaymentType { get; set; }
}
Az egyes tulajdonságok az adathalmaz egy oszlopára vannak leképelve. A tulajdonságok további attribútumokkal vannak eljegyzve.
Az ColumnName
attribútum lehetővé teszi annak megadását, hogy ML.NET hogyan hivatkozzon az oszlopra az adatokon való működés során. Például, bár a tulajdonság a TripDistance
standard .NET elnevezési konvenciók szerint van, a modell csak egy oszlopot vagy funkciót ismer, más néven trip_distance
. Az elnevezési eltérés megoldásához az ColumnName
attribútum a TripDistance
tulajdonságot egy oszlopra vagy szolgáltatásra képezi le a név trip_distance
alapján.
Numerikus értékek esetén ML.NET csak értéktípusokon Single
működik. Egyes oszlopok eredeti adattípusa azonban egész szám. Az OnnxMapType
attribútum típusokat képez le az ONNX és ML.NET között.
Az adatattribútumokról további információt az ML.NET adatbetöltési útmutatóban talál.
Modell kimeneti sémájának definiálása
Az adatok feldolgozása után egy bizonyos formátumú kimenet jön létre. Adja meg az adatkimeneti sémát. Hozzon létre egy új osztályt OnnxOutput
az alábbi tulajdonságokkal a Program.cs fájlban.
public class OnnxOutput
{
[ColumnName("variable_out1")]
public float[] PredictedFare { get; set; }
}
OnnxInput
Ehhez hasonlóan az ColumnName
attribútum használatával leképezi a variable_out1
kimenetet egy leíróbb névre PredictedFare
.
Előrejelzési folyamat definiálása
A ML.NET folyamat általában láncolt átalakítások sorozata, amelyek a bemeneti adatokon működnek a kimenet létrehozásához. Az adatátalakításokról további információt az ML.NET adatátalakítási útmutatóban talál.
Új metódus
GetPredictionPipeline
létrehozása azProgram
osztályon belülstatic ITransformer GetPredictionPipeline(MLContext mlContext) { }
Adja meg a bemeneti és kimeneti oszlopok nevét. Adja hozzá a következő kódot a metódushoz
GetPredictionPipeline
.var inputColumns = new string [] { "vendor_id", "rate_code", "passenger_count", "trip_time_in_secs", "trip_distance", "payment_type" }; var outputColumns = new string [] { "variable_out1" };
Definiálja a folyamatot. A
IEstimator
folyamat műveleteinek tervrajza, valamint a folyamat bemeneti és kimeneti sémái.var onnxPredictionPipeline = mlContext .Transforms .ApplyOnnxModel( outputColumnNames: outputColumns, inputColumnNames: inputColumns, ONNX_MODEL_PATH);
Ebben az esetben
ApplyOnnxModel
ez az egyetlen átalakítás a folyamatban, amely a bemeneti és kimeneti oszlopok nevét, valamint az ONNX-modellfájl elérési útját veszi fel.Csak
IEstimator
az adatokra alkalmazandó műveletek készletét határozza meg. Az adatokon az úgynevezett ..</a0> Fit
A metódus használatával hozzon létre egyet a sajátonnxPredictionPipeline
fiókjából.var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] {}); return onnxPredictionPipeline.Fit(emptyDv);
A
Fit
metódus bemenetként várjaIDataView
a műveletek végrehajtását. Az egyikIDataView
módszer az adatok táblázatos formátumban való ábrázolására ML.NET. Mivel ebben az esetben a folyamat csak előrejelzésekhez használatos, üresIDataView
értéket adhat meg aITransformer
szükséges bemeneti és kimeneti sémaadatok megadásához. A beszereltITransformer
elemet ezután visszajuttatjuk az alkalmazásban való további használat céljából.Tipp.
Ebben a mintában a folyamat ugyanabban az alkalmazásban van definiálva és használva. Javasoljuk azonban, hogy külön alkalmazásokkal definiálja és használja a folyamatot előrejelzések készítéséhez. A ML.NET a folyamatok szerializálhatók és menthetők más .NET végfelhasználói alkalmazásokban való további használatra. ML.NET különböző üzembehelyezési célokat támogat, például asztali alkalmazásokat, webszolgáltatásokat, WebAssembly-alkalmazásokat és még sok mást. A folyamatok mentésével kapcsolatos további információkért tekintse meg a ML.NET betanított modellek mentésére és betöltésére vonatkozó útmutatót.
A metóduson
Main
belül hívja meg a metódustGetPredictionPipeline
a szükséges paraméterekkel.var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
Előrejelzések készítése a modell használatával
Most, hogy rendelkezik egy folyamatmal, ideje előrejelzést készítenie. ML.NET egy egyszerű API-t biztosít az előrejelzések készítéséhez egyetlen, úgynevezett PredictionEngine
adatpéldányon.
A metóduson
Main
belül hozzon létre egyPredictionEngine
metódustCreatePredictionEngine
.var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
Hozzon létre egy tesztadat-bemenetet.
var testInput = new OnnxInput { VendorId = "CMT", RateCode = 1, PassengerCount = 1, TripTimeInSecs = 1271, TripDistance = 3.8f, PaymentType = "CRD" };
predictionEngine
A módszerrel előrejelzéseket készíthet az újtestInput
adatokPredict
alapján.var prediction = onnxPredictionEngine.Predict(testInput);
Adja ki az előrejelzés eredményét a konzolon.
Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
Az alkalmazás futtatásához használja a .NET CLI-t.
dotnet run
Az eredménynek az alábbi kimenethez hasonlóan kell kinéznie:
Predicted Fare: 15.621523
Ha többet szeretne megtudni az előrejelzések ML.NET való készítéséről, olvassa el a Modell használata előrejelzések készítéséhez című témakört.