.NET'te AutoML ONNX modeli kullanarak tahminde bulunma

Bu makalede, ML.NET kullanarak bir C# konsol uygulamasında tahminler yapmak için Azure Machine Learning AutoML Açık Sinir Ağı Değişimi (ONNX) modelini kullanmayı öğreneceksiniz. ML.NET , .NET ekosistemi için özel makine öğrenmesi modellerini eğitip kullanmanıza olanak tanıyan açık kaynak, platformlar arası bir makine öğrenmesi çerçevesidir. ML.NET C# veya F# gibi kod öncelikli bir yaklaşımı ya da Model Builder ve ML.NET CLI gibi düşük kodlu araçları destekler.

TensorFlow ve ONNX gibi diğer popüler makine öğrenmesi çerçevelerini kullanabilmeniz için ML.NET çerçevesi genişletilebilir. ONNX , çerçeveler arasında birlikte çalışabilirliği destekleyen yapay zeka modelleri için açık kaynak bir biçimdir. Modeli PyTorch gibi popüler bir makine öğrenmesi çerçevesinde eğitebilir, ONNX biçimine dönüştürebilir ve ONNX modelini ML.NET gibi farklı bir çerçevede kullanabilirsiniz.

Önkoşullar

C# konsol uygulaması oluşturma

Bu örnekte uygulamanızı derlemek için .NET CLI kullanılmaktadır. Visual Studio veya başka bir IDE de kullanabilirsiniz.

  1. Yeni bir terminal açın ve adlı AutoMLONNXConsoleAppyeni bir C# .NET konsol uygulaması oluşturun. Uygulamanız için bu ada sahip bir dizin oluşturulur.

    dotnet new console -o AutoMLONNXConsoleApp
    
  2. AutoMLONNXConsoleApp dizinine geçin.

    cd AutoMLONNXConsoleApp
    

Yazılım paketleri ekleme

ML.NET, tahminler için ONNX çalışma zamanını kullanan bir API sağlar. Microsoft.ML, Microsoft.ML.OnnxRuntime ve Microsoft.ML.OnnxTransformer NuGet paketleri bir .NET uygulamasında ONNX modeli kullanmak için gereken bağımlılıkları içerir.

  1. Paketleri yükleyin.

    dotnet add package Microsoft.ML
    dotnet add package Microsoft.ML.OnnxRuntime
    dotnet add package Microsoft.ML.OnnxTransformer
    
  2. En üste aşağıdaki using yönergeleri eklemek için Program.cs dosyasını düzenleyin.

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

ONNX modeline bir başvuru ekleyin

Uygulamanıza ONNX model dosyasına bir referans ekleyin. Uygulamanın ONNX modeline erişmesinin bir yolu, derleme çıkış dizininden geçmektir. MSBuild ortak öğeleri hakkında daha fazla bilgi için bkz. MSBuild kılavuzu.

  1. ONNX modelinizi kopyalayın ve uygulamanızın AutoMLONNXConsoleApp kök dizinine yapıştırın.

  2. Aşağıdaki kodu düğümün içine eklemek için Project dosyasını düzenleyin. Bu durumda, ONNX model dosyasının adı automl-model.onnx'tir.

    <ItemGroup>
        <None Include="automl-model.onnx">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>
    
  3. Program.cs dosyasını düzenleyerek aşağıdaki satırı içine ekleyin.

    static string ONNX_MODEL_PATH = "automl-model.onnx";
    
  4. MLContext sınıfının Main yönteminde yeni bir Program örneği oluşturun.

    MLContext mlContext = new MLContext();
    

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

Model veri şemasını tanımlama

Model, giriş ve çıkış verilerini belirli bir biçimde bekler. ML.NET, sınıflar aracılığıyla verilerinizin biçimini tanımlamanıza olanak tanır. Aşağıdaki tabloda NYC Taxi Trip veri kümesindeki verileri kullanan bir model örneği gösterilmektedir.

satıcı kimliği oran_kodu yolcu sayısı seyahat_süresi_saniye seyahat mesafesi ödeme_tipi Ücret_tutarı
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

ONNX modelini inceleme

Veri biçiminizin nasıl göründüğünü bilmiyorsanız, ONNX modelini incelemek için gibi Netron bir araç kullanabilirsiniz. Modelinizin girişlerini ve çıkışlarını incelemek için kullanın Netron :

  1. Netron'ı açın.

  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, modelin automl-model.onnx yapısı aşağıdaki ekran görüntüsüne benzer:

    'Netron' AutoML ONNX Modelini gösteren ekran görüntüsü.

  4. Bu örnekte modelin meta verilerini görüntülemek için grafiğin variable_out1 en altındaki son düğümü 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 dosyanızda aşağıdaki özelliklere sahip 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; }
}

Veri özniteliklerini kullanma

Her özellik veri kümesindeki bir sütunla eşleşir. Özellikler, özniteliklerle daha da açıklanır.

  • özniteliği, ColumnName ML.NET veriler üzerinde çalışırken sütuna nasıl başvuracağını belirtmenize olanak tanır. Örneğin, TripDistance özelliği standart .NET adlandırma kurallarına uysa da, model yalnızca trip_distance adlı bir sütun veya özelliğe sahiptir. Bu adlandırma tutarsızlığını gidermek için ColumnName özniteliği, TripDistance özelliğini trip_distance adlı sütuna veya özelliğe eşler.

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

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

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

Veriler işlendikten sonra belirli bir biçimin çıkışını oluşturur. Veri çıktı şemanızı tanımlamak için aşağıdaki özelliklere sahip OnnxOutput dosyasında adlı yeni bir sınıf oluşturun:

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

Benzer şekilde, çıkışı daha açıklayıcı bir ad ile eşlemek için OnnxInput özniteliğini ColumnName, variable_out1 kullanın PredictedFare.

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 için ML.NET veri dönüştürme kılavuzuna bakın.

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

    static ITransformer GetPredictionPipeline(MLContext mlContext)
    {
    
    }
    
  2. Giriş ve çıkış sütun adlarını tanımlamak için 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ımlayan kodu ekleyin. , IEstimator işlemlerin bir şemasını ve işlem hattınızın giriş ve çıkış şemaları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ı ve 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. Fit yöntemini kullanarak verileriniz üzerinde çalışacak bir ITransformer yaratmak için onnxPredictionPipeline 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ş bekler. ML.NET bir IDataView tablo biçimindeki verileri temsil eder. Bu durumda işlem hattı yalnızca tahminler içindir, bu nedenle gerekli giriş ve çıkış şeması bilgilerini vermek IDataView için boş ITransformer bir alan sağlayabilirsiniz. Daha sonra uygulamanızda daha fazla kullanılmak üzere hazırlanan ITransformer olarak döndürülür.

    İpucu

    Bu örnek, işlem hattını aynı uygulama içinde tanımlar ve kullanır. Ancak, tahminler için işlem hattınızı tanımlamak ve kullanmak için ayrı uygulamalar kullanmak en iyisidir. ML.NET'de işlem hatlarınız diğer .NET son kullanıcı uygulamalarında daha fazla kullanım için seri hale getirilebilir ve kaydedilebilir.

    ML.NET masaüstü uygulamaları, web hizmetleri ve WebAssembly uygulamaları gibi çeşitli dağıtım hedeflerini destekler. İşlem hatlarını kaydetme hakkında daha fazla bilgi için ML.NET kaydetme ve eğitilen modelleri yükleme kılavuzuna bakın.

  5. İçinde Main yöntemi, gerekli parametrelerle GetPredictionPipeline yöntemini çağırın.

    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 kullanabilirsiniz. ML.NET adlı PredictionEnginetek bir veri örneğinde tahminler yapmak için kullanışlı bir API sağlar.

  1. `Main yönteminin içinde, PredictionEngine yöntemini kullanarak bir CreatePredictionEngine 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. Yeni onnxPredictionEngine verilerini temel alarak tahminlerde bulunmak için testInput yöntemini, Predict kullanarak yapın.

    var prediction = onnxPredictionEngine.Predict(testInput);
    
  4. Tahmininizin sonucunu konsola yazın.

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

    dotnet run
    

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

    Predicted Fare: 15.621523
    

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