Megosztás a következőn keresztül:


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

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.

  1. 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
    
  2. A terminálban keresse meg az AutoMLONNXConsoleApp könyvtárat.

    cd AutoMLONNXConsoleApp
    

Szoftvercsomagok hozzáadása

  1. 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.

  2. 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:

  1. Másolja az ONNX-modellt az alkalmazás AutoMLONNXConsoleApp gyökérkönyvtárába.

  2. 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ó.)

  3. 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.

  1. Nyissa meg Netront.

  2. 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.

  3. Megnyílik a modell. Az automl-model.onnx modell struktúrája például a következőképpen néz ki:

    Netron AutoML ONNX modell

  4. 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_distancealapjá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; }
}

OnnxInputEhhez 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.

  1. Új metódus GetPredictionPipeline létrehozása az Program osztályon belül

    static ITransformer GetPredictionPipeline(MLContext mlContext)
    {
    
    }
    
  2. 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" };
    
  3. 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.

  4. 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át onnxPredictionPipelinefiókjából.

    var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] {});
    
    return onnxPredictionPipeline.Fit(emptyDv);
    

    A Fit metódus bemenetként várja IDataView a műveletek végrehajtását. Az egyik IDataView 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, üres IDataView értéket adhat meg a ITransformer szükséges bemeneti és kimeneti sémaadatok megadásához. A beszerelt ITransformer 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.

  5. A metóduson Main belül hívja meg a metódust GetPredictionPipeline 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 PredictionEngineadatpéldányon.

  1. A metóduson Main belül hozzon létre egy PredictionEngine metódust CreatePredictionEngine .

    var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
    
  2. Hozzon létre egy tesztadat-bemenetet.

    var testInput = new OnnxInput
    {
        VendorId = "CMT",
        RateCode = 1,
        PassengerCount = 1,
        TripTimeInSecs = 1271,
        TripDistance = 3.8f,
        PaymentType = "CRD"
    };
    
  3. predictionEngine A módszerrel előrejelzéseket készíthet az új testInput adatok Predict alapján.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. Adja ki az előrejelzés eredményét a konzolon.

    Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
    
  5. 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.

Következő lépések