Spara och ladda tränade modeller
Lär dig hur du sparar och läser in tränade modeller i ditt program.
Under hela modellskapandeprocessen finns en modell i minnet och är tillgänglig under programmets livscykel. Men när programmet slutar köras, om modellen inte sparas någonstans lokalt eller via fjärranslutning, är den inte längre tillgänglig. Modeller används vanligtvis någon gång efter träning i andra program, antingen för slutsatsdragning eller omträning. Därför är det viktigt att lagra modellen. Spara och ladda modeller med hjälp av stegen som beskrivs i de efterföljande avsnitten i den här artikeln när du använder en pipeline för dataförberedelse och modellträning som den som visas här. Även om det här exemplet använder en linjär regressionsmodell gäller samma process för andra ML.NET algoritmer.
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");
Eftersom de flesta modeller och pipelines för dataförberedelse ärver från samma uppsättning klasser, är signaturerna för spara- och inläsningsmetoden hos dessa komponenter desamma. Beroende på ditt användningsfall kan du antingen kombinera pipelinen och modellen för förberedelse av data till en enda EstimatorChain
som skulle mata ut en enda ITransformer
eller separera dem och därmed skapa en separat ITransformer
för var och en.
Spara en modell lokalt
När du sparar en modell behöver du två saker:
- Modellens
ITransformer
. -
DataViewSchema
förITransformer
förväntade indata.
När du har tränat modellen använder du metoden Save
för att spara den tränade modellen i en fil som heter model.zip
med hjälp av DataViewSchema
av indata.
// Save Trained Model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");
Spara en ONNX-modell lokalt
Om du vill spara en ONNX-version (Open Neural Network Exchange) av din modell lokalt måste du installera Microsoft.ML.OnnxConverter NuGet-paketet.
Med det OnnxConverter
paketet installerat kan du använda det för att spara din modell i ONNX-format. Detta kräver ett Stream
objekt som du kan ange som en FileStream
med hjälp av metoden File.Create
. Metoden File.Create
tar en strängparameter som representerar sökvägen till ONNX-modellen.
using FileStream stream = File.Create("./onnx_model.onnx");
När strömmen har skapats kan du anropa metoden ConvertToOnnx
och ge den den tränade modellen, de data som används för att träna modellen och strömmen. Alla tränare och transformatorer kan dock inte exporteras till ONNX. En fullständig lista finns i guiderna Transforms och How to Choose an ML.NET Algorithm .
mlContext.Model.ConvertToOnnx(trainedModel, data, stream);
Läsa in en modell som lagras lokalt
Modeller som lagras lokalt kan användas i andra processer eller program som ASP.NET Core och serverlösa webbappar. Mer information finns i Use ML.NET in Web API and Deploy ML.NET Serverless Web App.
I ett separat program eller en separat process använder du metoden Load
tillsammans med filsökvägen för att integrera den tränade modellen i ditt program.
//Define DataViewSchema for data preparation pipeline and trained model
DataViewSchema modelSchema;
// Load trained model
ITransformer trainedModel = mlContext.Model.Load("model.zip", out modelSchema);
Läsa in en ONNX-modell lokalt
Om du vill läsa in en ONNX-modell för förutsägelser installerar du Microsoft.ML.OnnxTransformer NuGet-paketet.
Med det OnnxTransformer
paketet installerat kan du läsa in en befintlig ONNX-modell med hjälp av metoden ApplyOnnxModel
. Den obligatoriska parametern är en sträng som är sökvägen till den lokala ONNX-modellen.
OnnxScoringEstimator estimator = mlContext.Transforms.ApplyOnnxModel("./onnx_model.onnx");
Metoden ApplyOnnxModel
returnerar ett OnnxScoringEstimator
objekt. Först måste du läsa in nya data.
HousingData[] newHousingData = new HousingData[]
{
new()
{
Size = 1000f,
HistoricalPrices = new[] { 300_000f, 350_000f, 450_000f },
CurrentPrice = 550_00f
}
};
Läs in nya data i en IDataView
med hjälp av metoden LoadFromEnumerable.
IDataView newHousingDataView = mlContext.Data.LoadFromEnumerable(newHousingData);
Nu kan du använda den nya IDataView
för att anpassa till den nya datan.
estimator.Fit(newHousingDataView);
När du har använt metoden Fit
på en skattare från ApplyOnnxModel
kan den sedan sparas som en ny modell med hjälp av metoden Spara som beskrivs i avsnittet spara en modell lokalt.
Läsa in en modell som lagras på distans
Om du vill läsa in datapreparationspipelines och modeller som är lagrade på en fjärrplats i ditt program, använd en Stream
i stället för en filsökväg i metoden Load
.
// 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);
}
Arbeta med separat dataförberedelse och modellflöden
Notera
Det är valfritt att arbeta med separata pipelines för dataförberedelse och modellträning. Separation av pipelines gör det enklare att inspektera inlärda modellparametrar. För förutsägelser är det enklare att spara och läsa in en enda pipeline som innehåller dataförberedelser och modellträningsåtgärder.
När du arbetar med separata pipelines och modeller för dataförberedelse gäller samma process som enskilda pipelines. Skillnaden är att båda pipelines måste sparas och läsas in samtidigt.
Givna pipelines för separata dataförberedelse- och modellträningsprocesser:
// 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);
Spara dataförberedelsepipeline och den tränade modellen
Om du vill spara både dataförberedelsepipelinen och den tränade modellen använder du följande kommandon:
// 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");
Läsa in datapreparationspipeline och tränad modell
I en separat process eller ett program läser du in pipelinen för förberedelse av data och tränad modell samtidigt på följande sätt:
// 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);