首页 > 解决方案 > 加载预训练模型(例如从 onnx 文件)时,fit 方法会做什么

问题描述

如果我加载一个完全训练的模型(例如从一个 onnx 文件),我可以摆脱 pipeline.Fit(trainingData) 方法吗?

fit 方法到底有什么作用?我在一些资料中读到该方法将执行训练步骤,在其他资料中我读到它适合管道(无论这意味着什么)。我还读到 fit 方法只是执行之前在管道中定义的步骤。

但是,如果我加载一个经过全面训练的模型,我是否需要管道中的这些步骤?当我从 .zip 文件加载模型时,我不需要 fit 方法。

为了澄清我的问题,我添加了一些代码......(代码不会在没有错误的情况下运行......我建议一些输入和输出列的命名问题......但这不是问题的一部分。;) ) 我想在没有 .fit 方法的情况下调用 CreatePredictionEngine。(如前所述,可以使用保存的 .zip 模型)

感谢您提前澄清。;)

var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "image", imageFolder: "", inputColumnName: nameof(ImageData.ImagePath))
                            .Append(mlContext.Transforms.ResizeImages(outputColumnName: "image", imageWidth: ImageNetSettings.imageWidth, imageHeight: ImageNetSettings.imageHeight, inputColumnName: "image"))
                            .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "inception_v3_input", inputColumnName: "image"))
                            .Append(mlContext.Transforms.ApplyOnnxModel(modelFile: modelLocation, outputColumnNames: new[] { TinyYoloModelSettings.ModelOutput }, inputColumnNames: new[] { TinyYoloModelSettings.ModelInput }))
                            .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "LabelKey", inputColumnName: "Label"))
                            .Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: "LabelKey", featureColumnName: TinyYoloModelSettings.ModelOutput))
                            .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabelValue", "PredictedLabel"))
                            .AppendCacheCheckpoint(mlContext);


IDataView trainingData = mlContext.Data.LoadFromTextFile<ImageData>(path: _trainTagsTsv, hasHeader: false);

ITransformer model = pipeline.Fit(trainingData);


var imageData = new ImageData()
{
   ImagePath = _url
};

var predictor = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model);
var prediction = predictor.Predict(imageData);

标签: ml.net

解决方案


我强烈建议您阅读这篇关于ML.NET高级概念的文档。作为一名开发人员,这可能比派生的文档和食谱更能说明问题 :)

不幸的是,该文档有点过时了:我在最终确定预测引擎的 API 之前编写了它,因此“预测函数”中的代码将无法编译。文件的其余部分似乎仍然有效。

在 ML.NET API 设计中,我们遵循一组Spark 命名约定。对我们来说不幸的是,sklearn 使用了相同的名称,但语义却完全不同。所以,ML.NET 做的是 Spark 做的,而不是 sklearn 做的。


简而言之,“管道”是一个Estimator。估计器只有一个操作:Fit,它获取数据并生成一个Transformer

另一方面,Transformers获取数据并生成数据。保存模型的 ZIP 文件包含转换器。

PredictionEngineTransformer构成。

通常,Estimator是可训练和不可训练运算符的“管道”或“链”,其中包括 ML 算法。但是,这不是必需的:您可以仅使用不可训练的运算符构建管道(例如从文件加载 ONNX 模型)。它仍然是一个Estimator(因此你必须调用Fit来获取Transformer,即使在这种情况下Fit将是一个空操作)。

的方法MLContext,按照Append设计,只创建Estimators。称其为强类型的代价,但这Fit是一个要求。


在这个解释中,我故意没有使用“模型”这个词:不幸的是,它已经变得如此负载,以至于很难判断“模型”是指“机器学习算法”还是“可以训练自己的可变对象”,或“这种培训的结果”。


推荐阅读