.NET'te AutoML ONNX modeliyle tahminde bulunma

Bu makalede, ML.NET ile bir C# .NET Core konsol uygulamasında tahminler yapmak için Otomatik ML (AutoML) Açık Sinir Ağı Değişimi (ONNX) modelini kullanmayı öğreneceksiniz.

ML.NET, C# veya F# dilinde kod öncelikli bir yaklaşımın yanı sıra Model Builder ve ML.NET CLI gibi düşük kodlu araçlar aracılığıyla özel makine öğrenmesi modellerini eğitip kullanmanıza olanak tanıyan açık kaynaklı, platformlar arası bir makine öğrenmesi çerçevesidir. Çerçeve ayrıca genişletilebilir ve TensorFlow ve ONNX gibi diğer popüler makine öğrenmesi çerçevelerinden yararlanmanızı sağlar.

ONNX, yapay zeka modelleri için açık kaynak bir biçimdir. ONNX, çerçeveler arasında birlikte çalışabilirliği destekler. Bu, PyTorch gibi birçok popüler makine öğrenmesi çerçevelerinden birinde modeli eğitebileceğiniz, ONNX biçimine dönüştürebileceğiniz ve ONNX modelini ML.NET gibi farklı bir çerçevede kullanabileceğiniz anlamına gelir. Daha fazla bilgi edinmek için ONNX web sitesini ziyaret edin.

Ön koşullar

C# konsol uygulaması oluşturma

Bu örnekte uygulamanızı derlemek için .NET Core CLI kullanırsınız, ancak visual studio kullanarak aynı görevleri gerçekleştirebilirsiniz. .NET Core CLI hakkında daha fazla bilgi edinin.

  1. Bir terminal açın ve yeni bir C# .NET Core konsol uygulaması oluşturun. Bu örnekte, uygulamanın adı şeklindedir AutoMLONNXConsoleApp. Uygulamanızın içeriğiyle aynı adla bir dizin oluşturulur.

    dotnet new console -o AutoMLONNXConsoleApp
    
  2. Terminalde AutoMLONNXConsoleApp dizinine gidin.

    cd AutoMLONNXConsoleApp
    

Yazılım paketleri ekleme

  1. .NET Core CLI kullanarak Microsoft.ML, Microsoft.ML.OnnxRuntime ve Microsoft.ML.OnnxTransformer NuGet paketlerini yükleyin.

    dotnet add package Microsoft.ML
    dotnet add package Microsoft.ML.OnnxRuntime
    dotnet add package Microsoft.ML.OnnxTransformer
    

    Bu paketler bir .NET uygulamasında ONNX modeli kullanmak için gereken bağımlılıkları içerir. ML.NET, tahminler için ONNX çalışma zamanını kullanan bir API sağlar.

  2. Program.cs dosyasını açın ve uygun paketlere başvurmak için en üste aşağıdaki using deyimleri ekleyin.

    using System.Linq;
    using Microsoft.ML;
    using Microsoft.ML.Data;
    using Microsoft.ML.Transforms.Onnx;
    

ONNX modeline başvuru ekleme

Konsol uygulamasının ONNX modeline erişmesinin bir yolu, bunu derleme çıktı dizinine eklemektir. MSBuild ortak öğeleri hakkında daha fazla bilgi edinmek için MSBuild kılavuzuna bakın. Henüz bir modeliniz yoksa örnek bir model oluşturmak için bu not defterini izleyin.

Uygulamanızda ONNX model dosyanıza başvuru ekleme

  1. ONNX modelinizi uygulamanızın AutoMLONNXConsoleApp kök dizinine kopyalayın.

  2. AutoMLONNXConsoleApp.csproj dosyasını açın ve düğümün Project içine aşağıdaki içeriği ekleyin.

    <ItemGroup>
        <None Include="automl-model.onnx">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
    

    Bu durumda, ONNX model dosyasının adı automl-model.onnx'tir.

  3. Program.cs dosyasını açın ve sınıfına Program aşağıdaki satırı ekleyin.

    static string ONNX_MODEL_PATH = "automl-model.onnx";
    

MLContext'i başlatma

Main Sınıfınızın Program yönteminin içinde yeni bir örneği MLContextoluşturun.

MLContext mlContext = new MLContext();

MLContext sınıfı tüm ML.NET işlemleri için bir başlangıç noktasıdır ve başlatmamlContext, model yaşam döngüsü boyunca paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'teki DbContext ile kavramsal olarak benzerdir.

Model veri şemasını tanımlama

Modeliniz giriş ve çıkış verilerinizi belirli bir biçimde bekler. ML.NET, sınıflar aracılığıyla verilerinizin biçimini tanımlamanıza olanak tanır. Bazen bu biçimin nasıl göründüğünü zaten biliyor olabilirsiniz. Veri biçimini bilmediğiniz durumlarda, ONNX modelinizi incelemek için Netron gibi araçları kullanabilirsiniz.

Bu örnekte kullanılan model, NYC TLC Taxi Trip veri kümesindeki verileri kullanır. Verilerin bir örneğini aşağıda görebilirsiniz:

vendor_id rate_code passenger_count trip_time_in_secs trip_distance payment_type fare_amount
VTS Kategori 1 Kategori 1 1140 3.75 CRD 15.5
VTS Kategori 1 Kategori 1 480 2.72 CRD 10.0
VTS Kategori 1 Kategori 1 1680 7.8 CSH 26.5

ONNX modelini inceleme (isteğe bağlı)

Modelinizin girişlerini ve çıkışlarını incelemek için Netron gibi bir araç kullanın.

  1. Netron'un açılması.

  2. Üst menü çubuğunda Dosya > Aç'ı seçin ve dosya tarayıcısını kullanarak modelinizi seçin.

  3. Modeliniz açılır. Örneğin, automl-model.onnx modelinin yapısı aşağıdaki gibi görünür:

    Netron AutoML ONNX Model

  4. Modelin meta verilerini görüntülemek için grafiğin en altındaki son düğümü (variable_out1 bu örnekte) seçin. Kenar çubuğundaki girişler ve çıkışlar modelin beklenen girişlerini, çıkışlarını ve veri türlerini gösterir. Modelinizin giriş ve çıkış şemasını tanımlamak için bu bilgileri kullanın.

Model giriş şemasını tanımlama

Program.cs dosyasının içinde aşağıdaki özelliklerle adlı OnnxInput yeni bir sınıf oluşturun.

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; }
}

Özelliklerin her biri veri kümesindeki bir sütuna eşler. Özelliklere özniteliklerle ek açıklama eklenir.

özniteliği, ColumnName veriler üzerinde çalışırken ML.NET sütuna nasıl başvuracağını belirtmenize olanak tanır. Örneğin, özelliği standart .NET adlandırma kurallarına uysa TripDistance da, model yalnızca olarak trip_distancebilinen bir sütunu veya özelliği bilir. Bu adlandırma tutarsızlığını gidermek için özniteliği, ColumnName özelliğini adıyla trip_distancebir sütuna veya özelliğe eşlerTripDistance.

Sayısal değerler için ML.NET yalnızca değer türlerinde Single çalışır. Ancak, bazı sütunların özgün veri türü tamsayılardır. özniteliği, OnnxMapType ONNX ile ML.NET arasındaki türleri eşler.

Veri öznitelikleri hakkında daha fazla bilgi edinmek için veri yükleme ML.NET kılavuzuna bakın.

Model çıktı şemasını tanımlama

Veriler işlendikten sonra belirli bir biçimin çıkışını oluşturur. Veri çıkış şemanızı tanımlayın. Program.cs dosyasının içinde aşağıdaki özelliklerle adlı OnnxOutput yeni bir sınıf oluşturun.

public class OnnxOutput
{
    [ColumnName("variable_out1")]
    public float[] PredictedFare { get; set; }
}

benzer şekildeOnnxInput, çıkışını ColumnName daha açıklayıcı bir adla PredictedFareeşlemek variable_out1 için özniteliğini kullanın.

Tahmin işlem hattı tanımlama

ML.NET'daki işlem hattı genellikle giriş verileri üzerinde çalıştırılan zincirlenmiş dönüştürmelerden oluşan bir seridir ve çıkış oluşturur. Veri dönüştürmeleri hakkında daha fazla bilgi edinmek için ML.NET veri dönüştürme kılavuzuna bakın.

  1. sınıfının içinde Program adlı GetPredictionPipeline yeni bir yöntem oluşturma

    static ITransformer GetPredictionPipeline(MLContext mlContext)
    {
    
    }
    
  2. Giriş ve çıkış sütunlarının adını tanımlayın. Yönteminin içine GetPredictionPipeline aşağıdaki kodu ekleyin.

    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. İşlem hattınızı tanımlayın. , IEstimator işlem hattınızın işlem, giriş ve çıkış şemalarının bir şemasını sağlar.

    var onnxPredictionPipeline =
        mlContext
            .Transforms
            .ApplyOnnxModel(
                outputColumnNames: outputColumns,
                inputColumnNames: inputColumns,
                ONNX_MODEL_PATH);
    

    Bu durumda, ApplyOnnxModel giriş ve çıkış sütunlarının adlarının yanı sıra ONNX model dosyasının yolunu alan işlem hattındaki tek dönüşümdür.

  4. yalnızca IEstimator verilerinize uygulanacak işlem kümesini tanımlar. Verileriniz üzerinde çalışan şey olarak ITransformerbilinir. yöntemiyle Fit kendi yönteminizden onnxPredictionPipelinebir tane oluşturun.

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

    yöntemi, Fit üzerinde işlemleri gerçekleştirmek için bir IDataView giriş olarak bekler. , IDataView tablosal biçim kullanarak ML.NET verileri temsil etmenin bir yoludur. Bu durumda işlem hattı yalnızca tahminler için kullanıldığındanITransformer, gerekli giriş ve çıkış şeması bilgilerini vermek için boş IDataView bir sağlayabilirsiniz. Daha sonra uygulamanızda daha fazla kullanım için takılmış ITransformer olarak döndürülür.

    Bahşiş

    Bu örnekte işlem hattı tanımlanır ve aynı uygulama içinde kullanılır. Ancak tahminde bulunmak için işlem hattınızı tanımlamak ve kullanmak için ayrı uygulamalar kullanmanız önerilir. ML.NET işlem hatlarınız diğer .NET son kullanıcı uygulamalarında daha fazla kullanılmak üzere seri hale getirilebilir ve kaydedilebilir. ML.NET masaüstü uygulamaları, web hizmetleri, WebAssembly uygulamaları* ve daha birçok farklı dağıtım hedefini destekler. İşlem hatlarını kaydetme hakkında daha fazla bilgi edinmek için ML.NET kaydetme ve eğitilen modelleri yükleme kılavuzuna bakın.

    *WebAssembly yalnızca .NET Core 5 veya üzeri için desteklenir

  5. yönteminin Main içinde gerekli parametrelerle yöntemini çağırın GetPredictionPipeline .

    var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
    

Tahminlerde bulunmak için modeli kullanma

Artık bir işlem hattınız olduğuna göre, tahminlerde bulunmak için bunu kullanmanın zamanı geldi. ML.NET adlı PredictionEnginetek bir veri örneğinde tahminler yapmak için kullanışlı bir API sağlar.

  1. yönteminin içinde Main yöntemini kullanarak CreatePredictionEngine bir PredictionEngine oluşturun.

    var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
    
  2. Test verileri girişi oluşturun.

    var testInput = new OnnxInput
    {
        VendorId = "CMT",
        RateCode = 1,
        PassengerCount = 1,
        TripTimeInSecs = 1271,
        TripDistance = 3.8f,
        PaymentType = "CRD"
    };
    
  3. predictionEngine yöntemini kullanarak yeni testInput verileri temel alarak tahminlerde bulunmak için öğesini Predict kullanın.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. Tahmininizin sonucunu konsola çıktı olarak ekleyin.

    Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
    
  5. Uygulamanızı çalıştırmak için .NET Core CLI kullanın.

    dotnet run
    

    Sonuç aşağıdaki çıkışa benzer görünmelidir:

    Predicted Fare: 15.621523
    

ML.NET'de tahmin yapma hakkında daha fazla bilgi edinmek için bkz . Tahmin yapmak için model kullanma kılavuzu.

Sonraki adımlar