Eğitilen modelleri kaydetme ve yükleme

Uygulamanıza eğitilmiş modelleri kaydetmeyi ve yüklemeyi öğrenin.

Model oluşturma işlemi boyunca model bellekte yer alır ve uygulamanın yaşam döngüsü boyunca erişilebilir. Ancak uygulama çalışmayı durdurduktan sonra model yerel olarak veya uzaktan bir yere kaydedilmediyse artık erişilebilir değildir. Modeller genellikle diğer uygulamalarda eğitimden sonra çıkarım veya yeniden eğitim için kullanılır. Bu nedenle modeli depolamak önemlidir. Aşağıda açıklanan gibi veri hazırlama ve model eğitim işlem hatlarını kullanırken bu belgenin sonraki bölümlerinde açıklanan adımları kullanarak modelleri kaydedin ve yükleyin. Bu örnek doğrusal regresyon modeli kullansa da, aynı işlem diğer ML.NET algoritmaları için de geçerlidir.

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f, 125000f, 122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    }
};

// Create MLContext
MLContext mlContext = new MLContext();

// Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(housingData);

// Define data preparation estimator
EstimatorChain<RegressionPredictionTransformer<LinearRegressionModelParameters>> pipelineEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"))
        .Append(mlContext.Regression.Trainers.Sdca());

// Train model
ITransformer trainedModel = pipelineEstimator.Fit(data);

// Save model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");

Çoğu model ve veri hazırlama işlem hattı aynı sınıf kümesinden devraldığından, bu bileşenler için kaydetme ve yükleme yöntemi imzaları aynıdır. Kullanım örneğinize bağlı olarak, veri hazırlama işlem hattını ve modelini tek EstimatorChain bir çıkış oluşturacak tek bir ITransformer işlem hattında birleştirebilir veya bunları ayırarak her biri için ayrı ITransformer bir tane oluşturabilirsiniz.

Modeli yerel olarak kaydetme

Modeli kaydederken iki şeye ihtiyacınız vardır:

  1. Modelin ITransformer modeli.
  2. ' DataViewSchema nin ITransformerbeklenen girişi.

Modeli eğitdikten sonra, eğitilen modeli giriş verilerini kullanarak adlı model.zip bir dosyaya DataViewSchema kaydetmek için yöntemini kullanınSave.

// Save Trained Model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");

ONNX modelini yerel olarak kaydetme

Modelinizin ONNX sürümünü yerel olarak kaydetmek için Microsoft.ML.OnnxConverter NuGet paketinin yüklü olması gerekir.

OnnxConverter Paketi yükledikten sonra modelimizi ONNX biçiminde kaydetmek için kullanabiliriz. Bu, yöntemini kullanarak File.Create sağlayabileceğiniz bir FileStream nesne gerektirirStream. yöntemi, File.Create ONNX modelinin yolu olacak bir dizeyi parametre olarak alır.

using FileStream stream = File.Create("./onnx_model.onnx");

Akış oluşturulduktan sonra yöntemini çağırabilir ConvertToOnnx ve eğitilen modeli, modeli eğitmek için kullanılan verileri ve akışı verebiliriz. Ancak tüm eğitmenler ve transformatörler ONNX'e aktarılamaz. Tam liste için Dönüşümler ve ML.NET Algoritması Seçme kılavuzlarını ziyaret edin.

mlContext.Model.ConvertToOnnx(trainedModel, data, stream);

Yerel olarak depolanan bir modeli yükleme

Yerel olarak depolanan modeller ve Serverless Web Applicationsgibi ASP.NET Core diğer işlemlerde veya uygulamalarda kullanılabilir. Daha fazla bilgi edinmek için bkz . Web API'sinde ML.NET kullanma ve Sunucusuz Web Uygulaması dağıtma ML.NET nasıl yapılır makaleleri.

Ayrı bir uygulama veya işlemde Load , eğitilen modeli uygulamanıza almak için dosya yolu ile birlikte yöntemini kullanın.

//Define DataViewSchema for data preparation pipeline and trained model
DataViewSchema modelSchema;

// Load trained model
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);

ONNX modelini yerel olarak yükleme

Tahminler için bir ONNX modeli yüklemek için Microsoft.ML.OnnxTransformer NuGet paketi gerekir.

OnnxTransformer Paket yüklü olduğunda, yöntemini kullanarak ApplyOnnxModel mevcut bir ONNX modelini yükleyebilirsiniz. Gerekli parametre, yerel ONNX modelinin yolu olan bir dizedir.

OnnxScoringEstimator estimator = mlContext.Transforms.ApplyOnnxModel("./onnx_model.onnx");

ApplyOnnxModel yöntemi bir OnnxScoringEstimator nesnesi döndürür. İlk olarak yeni verileri yüklemeliyiz.

HousingData[] newHousingData = new HousingData[]
{
    new()
    {
        Size = 1000f,
        HistoricalPrices = new[] { 300_000f, 350_000f, 450_000f },
        CurrentPrice = 550_00f
    }
};

Yeni verilerle yöntemini kullanarak LoadFromEnumerable bunu bir IDataView içine yükleyebiliriz.

IDataView newHousingDataView = mlContext.Data.LoadFromEnumerable(newHousingData);

Artık yeni IDataView verileri sığdırmak için yeniyi kullanabiliriz.

estimator.Fit(newHousingDataView);

'den ApplyOnnxModelbir tahmin aracında Sığdır yöntemi kullanıldıktan sonra, belirtilen Save yöntemiyle modeli yerel olarak kaydetme bölümü kullanılarak yeni bir model olarak kaydedilebilir.

Uzaktan depolanan bir modeli yükleme

Uzak bir konumda depolanan veri hazırlama işlem hatlarını ve modelleri uygulamanıza yüklemek için yönteminde Load dosya yolu yerine bir kullanınStream.

// Create MLContext
MLContext mlContext = new MLContext();

// Define DataViewSchema and ITransformers
DataViewSchema modelSchema;
ITransformer trainedModel;

// Load data prep pipeline and trained model
using (HttpClient client = new HttpClient())
{
    Stream modelFile = await client.GetStreamAsync("<YOUR-REMOTE-FILE-LOCATION>");

    trainedModel = mlContext.Model.Load(modelFile, out modelSchema);
}

Ayrı veri hazırlama ve model işlem hatları ile çalışma

Not

Ayrı veri hazırlama ve model eğitim işlem hatları ile çalışma isteğe bağlıdır. İşlem hatlarının ayrılması, öğrenilen model parametrelerini incelemeyi kolaylaştırır. Tahminler için veri hazırlama ve model eğitim işlemlerini içeren tek bir işlem hattını kaydetmek ve yüklemek daha kolaydır.

Ayrı veri hazırlama işlem hatları ve modelleri ile çalışırken, tek işlem hatları ile aynı işlem uygulanır; ancak artık her iki işlem hattının da aynı anda kaydedilmesi ve yüklenmesi gerekir.

Ayrı veri hazırlama ve model eğitim işlem hatları verilmiştir:

// Define data preparation estimator
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data preparation transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Pre-process data using data prep operations
IDataView transformedData = dataPrepTransformer.Transform(data);

// Train regression model
RegressionPredictionTransformer<LinearRegressionModelParameters> trainedModel = sdcaEstimator.Fit(transformedData);

Veri hazırlama işlem hattını ve eğitilmiş modeli kaydetme

Hem veri hazırlama işlem hattını hem de eğitilmiş modeli kaydetmek için aşağıdaki komutları kullanın:

// Save Data Prep transformer
mlContext.Model.Save(dataPrepTransformer, data.Schema, "data_preparation_pipeline.zip");

// Save Trained Model
mlContext.Model.Save(trainedModel, transformedData.Schema, "model.zip");

Veri hazırlama işlem hattını ve eğitilmiş modeli yükleme

Ayrı bir işlem veya uygulamada veri hazırlama işlem hattını ve eğitilen modeli aynı anda aşağıdaki gibi yükleyin:

// Create MLContext
MLContext mlContext = new MLContext();

// Define data preparation and trained model schemas
DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline and trained model
ITransformer dataPrepPipeline = mlContext.Model.Load("data_preparation_pipeline.zip",out dataPrepPipelineSchema);
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);