用keras保存的ML.NET加载模型

时间:2019-04-30 14:38:24

标签: python .net machine-learning keras ml.net

我有一个用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

3 个答案:

答案 0 :(得分:2)

答案 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。我找到了一个很好的教程来解释如何做到这一点:

https://fizzylogic.nl/2018/02/16/heres-why-microsoft-cognitive-toolkit-is-the-coolest-deep-learning-framework-around/