fit 方法在加载预训练模型时做什么(例如从 onnx 文件)

what does fit method do when loading pretrained model (e.g. from onnx file)

如果我加载一个经过充分训练的模型(例如从 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 的 high-level concepts 上阅读此文档。作为一名开发人员,这可能比派生的文档和方法更能说明问题 :)

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

在ML.NETAPI设计中,我们沿用了Spark naming conventions. Unfortunately for us, sklearn uses the same names with completely different semantics的那一套。所以,ML.NET 做的是 Spark 做的,而不是 sklearn 做的。


简而言之,'pipeline' 是一个 Estimator。估计器只有一个操作:Fit,它获取数据并产生一个 Transformer.

变形金刚,另一方面,获取数据并产生数据。您保存模型的 ZIP 文件包含转换器。

PredictionEngineTransformer 构成。

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

MLContextAppend 方法在设计上仅创建 Estimators。称之为强类型的代价,但 Fit 是一个要求。


在这个解释中,我故意没有使用术语 'model':不幸的是,它已经变得如此负载以至于很难判断 'model' 是指 'the ML algorithm',还是 'a mutable object that can train itself',或'the result of such training'。