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

Load model with ML.NET saved with keras

我在 Python 中使用 Keras 实现了一个神经网络。训练完成后,我导出了模型,并且得到了两个文件:model.js 和 model.h5。现在我想在 .NET 项目中实时分类,我想为此使用经过训练的神经网络。

在 ML.NET 中有没有一种方法可以将使用 python 导出的模型和经过训练的权重加载到模型对象中?

我在文档[1]中看到可以加载以前保存的模型,但显然存储在 .zip 中,我找不到格式(可能是为了制作一个脚本,从 python 和 'translate' 到 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

ML.net 支持 ONNX 模型,如此 example.

您可以通过WinMLTools

将您的keras模型转换为ONNX模型

正如 Cihan Yakar 和 Jon 提到的那样,解决方案是将模型转换为 ONNX。我找到了一个很好的教程来解释如何操作:

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

我也经历过相同的过程,我强烈建议先使用 Python 的 Keras2onnx 库包将您的 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 class 基本上通过过滤图像文件(从目录中)读取 imageFolder 中的图像并使用两个属性识别它们, 标签是文件名,ImagePath 是图像文件的路径。 OnnxModelScorer class 运行加载模型和预测方法。

这就是 python Keras 从 C# 生成模型预测所需的全部内容。