ml.net - 加载预训练模型(例如从 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高级概念的文档。作为一名开发人员,这可能比派生的文档和食谱更能说明问题 :)
不幸的是,该文档有点过时了:我在最终确定预测引擎的 API 之前编写了它,因此“预测函数”中的代码将无法编译。文件的其余部分似乎仍然有效。
在 ML.NET API 设计中,我们遵循一组Spark 命名约定。对我们来说不幸的是,sklearn 使用了相同的名称,但语义却完全不同。所以,ML.NET 做的是 Spark 做的,而不是 sklearn 做的。
简而言之,“管道”是一个Estimator。估计器只有一个操作:Fit
,它获取数据并生成一个Transformer。
另一方面,Transformers获取数据并生成数据。保存模型的 ZIP 文件包含转换器。
PredictionEngine
由Transformer构成。
通常,Estimator是可训练和不可训练运算符的“管道”或“链”,其中包括 ML 算法。但是,这不是必需的:您可以仅使用不可训练的运算符构建管道(例如从文件加载 ONNX 模型)。它仍然是一个Estimator(因此你必须调用Fit
来获取Transformer,即使在这种情况下Fit
将是一个空操作)。
的方法MLContext
,按照Append
设计,只创建Estimators。称其为强类型的代价,但这Fit
是一个要求。
在这个解释中,我故意没有使用“模型”这个词:不幸的是,它已经变得如此负载,以至于很难判断“模型”是指“机器学习算法”还是“可以训练自己的可变对象”,或“这种培训的结果”。
推荐阅读
- unix - unix 中的 sed 命令不适用于大于 3GB 的文件
- angularjs - 如何在 AgularJS 中进行单选按钮验证
- javascript - Mongoose 中互惠文档引用的问题
- sql - 根据相关父表中的字段添加 SQL 唯一约束
- mysql - Next-Key Locks 和 Gap Lock 有什么区别?
- javascript - Leaflet.js:tile 的查询如何在 web 浏览器中工作
- java - 如何为所有相同的类元素编写相同过程的脚本直到结束?
- reactjs - 浏览器历史需要一个 DOM - 反应服务器端渲染
- elasticsearch - 从脚本无痛查询中的参数中获取所有键
- react-native - React Navigation - 访问嵌套了 createStackNavigator 的 createBottomTabNavigator 的 tabBarOnPress