我有一个用Keras用Python实现的神经网络。培训完之后,我就导出了模型,并得到了两个文件:model.js和model.h5。现在,我想在.NET项目中进行实时分类,并希望使用经过训练的神经网络。
在ML.NET中,有没有一种方法可以将通过python导出的模型和训练后的权重加载到模型对象中?
我在文档[1]中看到可以加载以前保存的模型,但显然是将其存储在.zip中,而我找不到格式(也许是从python和'将其转换为ML.NET模型。
显然hdf5格式是一种标准[2],有没有一种方法可以用ML.NET加载它?
[1] https://docs.microsoft.com/en-us/dotnet/machine-learning/how-to-guides/consuming-model-ml-net
[2] https://support.hdfgroup.org/HDF5/doc1.6/UG/10_Datasets.html
答案 0 :(得分:2)
ML.net支持ONNX模型。
您可以通过WinMLTools
将kreas模型转换为ONNX模型答案 1 :(得分:1)
我也走过同样的路,我强烈建议使用Keras2onnx Python软件包,先将Keras模块转换为“ onnx”格式。我使用的简单代码如下:
reconstructed_model = keras.models.load_model("<your location>\\my_model")
import onnx
import keras2onnx
model_name_onnx = "model.onnx"
onnx_model = keras2onnx.convert_keras(reconstructed_model, reconstructed_model.name)
onnx.save_model(onnx_model, model_name_onnx)
在C#方面,关于如何处理数据(即图像)和进行预测,请遵循Microsoft的示例(https://docs.microsoft.com/en-us/dotnet/machine-learning/tutorials/object-detection-onnx)
您可以将ML.NET与dotNet Core或Net framework> 4.7一起使用。 以下是有关如何读取图像文件以及如何运行model.onnx进行预测的摘录。
///First, load the data into an IDataView.
IEnumerable<ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder);
IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images);
var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext);
// Use model to score data
IEnumerable<float[]> probabilities = modelScorer.Score(imageDataView);
ImageNetData类基本上是通过过滤图像文件(从目录中)读取imageFolder上的图像,并通过两个属性来标识它们的, 标签是文件名,而ImagePath是图像文件的路径。 OnnxModelScorer类运行“加载模型”和“预测”方法。
这就是Python Keras从C#生成的模型预测所需要的全部信息。
答案 2 :(得分:0)
正如Cihan Yakar和Jon提到的,解决方案是将模型转换为ONNX。我找到了一个很好的教程来解释如何做到这一点: