加载预训练的模型时,fit方法有什么作用(例如,从onnx文件中获取)

时间:2019-11-27 15:48:46

标签: ml.net

如果我加载经过完全训练的模型(例如从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);

1 个答案:

答案 0 :(得分:0)

我强烈建议您在ML.NET的high-level concepts上阅读本文档。作为开发人员的同伴,这可能比派生的文档和食谱对您说得更好:)

不幸的是,该文档有些过时:我在最终确定预测引擎上的API之前就编写了该文档,因此“预测功能”中的代码将无法编译。该文档的其余部分似乎仍然保留。

在ML.NET API设计中,我们遵循Spark naming conventions的集合。对于我们来说不幸的是,sklearn与completely different semantics使用相同的名称。因此,ML.NET可以完成Spark的工作,而不是sklearn的工作。


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

另一方面,

变形金刚则获取数据并产生数据。保存模型的ZIP文件包含转换器。

PredictionEngine Transformer 构造而成。

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

根据设计,MLContext的{​​{1}}方法仅创建估计器。称其为强类型输入的价格,但是Append是必需的。


在这种解释中,我故意不使用“模型”一词:不幸的是,它变得如此繁重,以至于很难分辨“模型”是指“ ML算法”还是“可以训练的可变对象”本身”或“此类培训的结果”。