Spara och läs in 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 läs in modeller med hjälp av stegen som beskrivs i efterföljande avsnitt i det här dokumentet när du använder pipelines för dataförberedelse och modellträning, till exempel den som beskrivs nedan. Ä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 för dessa komponenter desamma. Beroende på ditt användningsfall kan du antingen kombinera dataförberedelsepipelinen och modellen 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
. - För
DataViewSchema
förväntadeITransformer
indata.
När du har tränat modellen använder du Save
metoden för att spara den tränade modellen i en fil som heter model.zip
med hjälp DataViewSchema
av indata.
// Save Trained Model
mlContext.Model.Save(trainedModel, data.Schema, "model.zip");
Spara en ONNX-modell lokalt
För att spara en ONNX-version av din modell lokalt behöver du NuGet-paketet Microsoft.ML.OnnxConverter installerat.
OnnxConverter
Med paketet installerat kan vi använda det för att spara vår modell i ONNX-format. Detta kräver ett Stream
objekt som vi kan ange som ett FileStream
med hjälp av File.Create
metoden. Metoden File.Create
tar in en sträng som en parameter som är sökvägen till ONNX-modellen.
using FileStream stream = File.Create("./onnx_model.onnx");
När strömmen har skapats kan vi anropa ConvertToOnnx
metoden 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 Transformeringar och Så här väljer du en ML.NET-algoritm .
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 Serverless Web Applications
. Mer information finns i Använda ML.NET i webb-API och distribuera ML.NET serverlösa webbappar .
I ett separat program eller en separat process använder du Load
metoden tillsammans med filsökvägen för att hämta den tränade modellen till 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 behöver du NuGet-paketet Microsoft.ML.OnnxTransformer .
OnnxTransformer
När paketet är installerat kan du läsa in en befintlig ONNX-modell med hjälp ApplyOnnxModel
av metoden . 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 vi läsa in nya data.
HousingData[] newHousingData = new HousingData[]
{
new()
{
Size = 1000f,
HistoricalPrices = new[] { 300_000f, 350_000f, 450_000f },
CurrentPrice = 550_00f
}
};
Med de nya data kan vi läsa in dem i en IDataView
med hjälp av LoadFromEnumerable
metoden.
IDataView newHousingDataView = mlContext.Data.LoadFromEnumerable(newHousingData);
Nu kan vi använda den nya IDataView
för att få plats med nya data.
estimator.Fit(newHousingDataView);
När du har använt fit-metoden på en skattare från ApplyOnnxModel
kan den sedan sparas som en ny modell med hjälp av save-metodensom nämns spara en modell lokalt.
Läsa in en modell som lagras på distans
Om du vill läsa in pipelines och modeller för förberedelse av data som lagras på en fjärrplats i ditt program använder du en Stream
i stället för en filsökväg i Load
metoden.
// 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 separata dataförberedelser och modellpipelines
Kommentar
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. förutom nu måste båda pipelines sparas och läsas in samtidigt.
Givet separata pipelines för dataförberedelse och modellträning:
// 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 pipeline för förberedelse av data och tränad modell
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 pipeline för förberedelse av data 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);