.NET'te AutoML ONNX modeliyle tahminde bulunma
Bu makalede, ML.NET içeren bir C# 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 kullanarak veya 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 kaynak, platformlar arası bir makine öğrenmesi çerçevesidir. Çerçeve 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.
Önkoşullar
- .NET 6 SDK veya üzeri
- Metin Düzenleyicisi veya IDE (Visual Studio veya Visual Studio Code gibi)
- ONNX modeli. AutoML ONNX modelini eğitmeyi öğrenmek için aşağıdaki banka pazarlama sınıflandırma not defterine bakın.
- Netron (isteğe bağlı)
C# konsol uygulaması oluşturma
Bu örnekte uygulamanızı derlemek için .NET CLI kullanırsınız, ancak visual studio kullanarak aynı görevleri gerçekleştirebilirsiniz. .NET CLI hakkında daha fazla bilgi edinin.
Bir terminal açın ve yeni bir C# .NET 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
Terminalde AutoMLONNXConsoleApp dizinine gidin.
cd AutoMLONNXConsoleApp
Yazılım paketleri ekleme
.NET 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.
Program.cs dosyasını açın ve en üste aşağıdaki
using
yönergeleri 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. Henüz bir modeliniz yoksa örnek bir model oluşturmak için bu not defterini izleyin.
Uygulamanızda ONNX model dosyanıza bir başvuru ekleyin:
ONNX modelinizi uygulamanızın AutoMLONNXConsoleApp kök dizinine kopyalayın.
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.
(MSBuild ortak öğeleri hakkında daha fazla bilgi edinmek için bkz. MSBuild kılavuzu.)
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 MLContext
oluş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'tekine DbContext benzer, kavramsal olarak.
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. Bazen bu biçimin nasıl göründüğünü zaten biliyor olabilirsiniz. Veri biçimini bilmediğiniz durumlarda, ONNX modelini incelemek için Netron gibi araçları kullanabilirsiniz.
Bu örnekte kullanılan model, NYC TLC Taxi Trip veri kümesindeki verileri kullanır. Aşağıdaki tabloda verilerin bir örneği gösterilmiştir:
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 |
ONNX modelini inceleme (isteğe bağlı)
Modelinizin girişlerini ve çıkışlarını incelemek için Netron gibi bir araç kullanın.
Netron'un açılması.
Üst menü çubuğunda Dosya > Aç'ı seçin ve dosya tarayıcısını kullanarak modelinizi seçin.
Modeliniz açılır. Örneğin, automl-model.onnx modelinin yapısı aşağıdaki gibi görünür:
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_distance
bilinen bir sütunu veya özelliği bilir. Bu adlandırma tutarsızlığını gidermek için özniteliği, ColumnName
özelliğini adıyla trip_distance
bir 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 PredictedFare
eş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.
sınıfının içinde
Program
adlıGetPredictionPipeline
yeni bir yöntem oluşturmastatic ITransformer GetPredictionPipeline(MLContext mlContext) { }
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" };
İşlem hattınızı tanımlayın. ,
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ın yanı sıra ONNX model dosyasının yolunu alan işlem hattındaki tek dönüşümdür.yalnızca
IEstimator
verilerinize uygulanacak işlem kümesini tanımlar. Verileriniz üzerinde çalışan şey olarakITransformer
bilinir. yöntemiyleFit
kendi yönteminizdenonnxPredictionPipeline
bir 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 birIDataView
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.İpucu
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'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, 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.
yönteminin
Main
içinde gerekli parametrelerle yöntemini çağırınGetPredictionPipeline
.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ı PredictionEngine
tek bir veri örneğinde tahminler yapmak için kullanışlı bir API sağlar.
yönteminin içinde
Main
yöntemini kullanarakCreatePredictionEngine
birPredictionEngine
oluşturun.var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
Test verileri girişi oluşturun.
var testInput = new OnnxInput { VendorId = "CMT", RateCode = 1, PassengerCount = 1, TripTimeInSecs = 1271, TripDistance = 3.8f, PaymentType = "CRD" };
predictionEngine
yöntemini kullanarak yenitestInput
verileri temel alarak tahminlerde bulunmak için öğesiniPredict
kullanın.var prediction = onnxPredictionEngine.Predict(testInput);
Tahmininizin sonucunu konsola çıktı olarak ekleyin.
Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");
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 edinmek için bkz . Tahmin yapmak için model kullanma.