我有一个使用Keras和Tensorflow后端(Keras 2.2.4 Tensorflow 1.13.1)的训练模型,我想在带有ML.Net的Visual Studio中使用该模型。
因此,我使用winmltools.convert_keras将我的模型转换为ONNX(我对Tensorflow 2.0模型感到厌倦,但出现了No module named 'tensorflow.tools.graph_transforms'
错误)。
现在我终于设法用以下方式加载模型:
string outName = "dense_6";
string inName = "conv2d_9_input";
string imgFolder = "path\to\Testimage
string pathToMLFile = "path\to\.onnx"
var pipeline = mlContext.Transforms.LoadImages(outputColumnName: outName, imageFolder: imgFolder, inputColumnName: inName)
.Append(mlContext.Transforms.ResizeImages(outName, 299, 299, inName))
.Append(mlContext.Transforms.ExtractPixels(outputColumnName: outName, interleavePixelColors: true, offsetImage: 117))
.Append(mlContext.Transforms.ApplyOnnxModel(outputColumnName: outName, inputColumnName: inName, modelFile: pathToMLFile, fallbackToCpu: true));
但是现在我需要一个IDataView来“拟合”模型(据我了解,需要对其进行初始化吗?) 因此,我用以下命令加载了一个空的IDataView:
var data = mlContext.Data.LoadFromEnumerable(new List<ImageNetData>());
ImageNetData
public class ImageNetData
{
[ColumnName("conv2d_9_input")]
[ImageType(299, 299)]
public Bitmap Image { get; set; }
[ColumnName("dense_6")]
public string Label;
}
现在我得到了错误:
Schema mismatch for input column 'conv2d_9_input': expected String, got Image<299, 299>
Parametername: inputSchema
我使用Netron的模型:
为什么要一个字符串?如果我删除 [ImageType(299,299)] 并将位图更改为 string ,我将得到:
Schema mismatch for input column 'conv2d_9_input': expected Image, got String
我希望我的问题是可以理解的。
更新: 在Gopal Vashishtha提示之后,我更改了输入/输出名称:
var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "image_object", imageFolder: imgFolder, inputColumnName: inName)
.Append(mlContext.Transforms.ResizeImages(outputColumnName: "image_object_resized", imageWidth: 299, imageHeight: 299, inputColumnName: "image_object"))
.Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", inputColumnName: "image_object_resized", interleavePixelColors: true, offsetImage: 117, scaleImage: 1 / 255f))
.Append(mlContext.Transforms.ApplyOnnxModel(outputColumnName: outName, inputColumnName: "input", modelFile: pathToMLFile + "\\Converted.onnx", fallbackToCpu: true))
但是我仍然有同样的错误。我训练模型的方式可能有问题吗?我使用了一个numpy数组作为图像,并使用了0/1/2作为相应的类。