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# .NET Core-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, valamint az olyan alacsony kódszámú eszközökkel, mint a Model Builder és a ML.NET CLI. A keretrendszer bővíthető is, é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 Core SDK 3.1 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 Core 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 Core parancssori felületéről.
Nyisson meg egy terminált, és hozzon létre egy új C# .NET Core-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 Core parancssori felületével.
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á felül a következő
using
utasításokat a megfelelő csomagokra való hivatkozáshoz.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. Az MSBuild gyakori elemeivel kapcsolatos további információkért tekintse meg az MSBuild útmutatót. Ha még nem rendelkezik modellel, kövesse ezt a jegyzetfüzetet egy példamodell létrehozásához.
Hivatkozás hozzáadása 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.
Nyissa meg a Program.cs fájlt, és adja hozzá a következő sort az
Program
osztályon belül.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. A dbContexthez fogalmilag hasonló az Entity Frameworkben.
A modell adatséma definiálása
A modell egy adott formátumban várja a bemeneti és kimeneti adatokat. 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 alább látható:
vendor_id | rate_code | passenger_count | trip_time_in_secs | trip_distance | payment_type | fare_amount |
---|---|---|---|---|---|---|
VTS | 1 | 1 | 1140 | 3.75 | CRD | 15,5 |
VTS | 1 | 1 | 480 | 2.72 | CRD | 10.0 |
VTS | 1 | 1 | 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
a Program.cs fájlban az alábbi tulajdonságokkal.
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
a Program.cs fájlban az alábbi tulajdonságokkal.
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, bemeneti és kimeneti sémáinak tervrajza.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 WebAssembly csak a .NET Core 5-ös vagy újabb verziójában támogatott
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 Core CLI-t.
dotnet run
Az eredménynek a következő 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, tekintse meg az előrejelzési útmutatók készítéséhez használt modellt.