python - 为什么 keras2onnx.convert_keras() 函数总是让我出错“'KerasTensor' 对象没有属性 'graph'”
问题描述
我有一个训练有素的模型(我自己训练的),它是 .h5 格式,它本身可以正常工作,但我需要将其转换为 .onnx 格式以便在 Unity Engine 中部署它,我搜索了如何转换 .h5 模型转换为 .onnx 格式并偶然发现 keras2onnx 库,并按照一些教程我得到了这个:
!pip install git+https://github.com/microsoft/onnxconverter-common
!pip install git+https://github.com/onnx/keras-onnx
import keras
import keras2onnx
import onnx
from tensorflow.keras.models import load_model
model = load_model('/content/drive/MyDrive/Sae/TesisProgra/CNNs/ParagrapshVsDrawings/REDPropiaFinal.h5')
onnx_model = keras2onnx.convert_keras(model, model.name)
temp_model_file = '/content/drive/MyDrive/Sae/TesisProgra/CNNs/ParagrapshVsDrawings/REDPropiaFinal.onnx'
onnx.save_model(onnx_model, temp_model_file)
问题是我不断收到错误代码: AttributeError: 'KerasTensor' object has no attribute 'graph',我尝试了不同的代码实现,但不断收到相同的错误,所以我的训练模型可能有问题?我真的不知道,我很迷茫,有人帮忙吗?这是我第一次处理 .onnx 格式,
如果您想在此处查看我的模型,这是一个 链接,我的模型接受了分析图像和区分具有绘图的图像与具有手写的图像的训练。最后,我的 CNN model.summary() 是这个:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (Conv2D) (None, 436, 308, 64) 640
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 218, 154, 64) 0
_________________________________________________________________
conv2d (Conv2D) (None, 216, 152, 32) 18464
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 108, 76, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 106, 74, 16) 4624
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 53, 37, 16) 0
_________________________________________________________________
flatten (Flatten) (None, 31376) 0
_________________________________________________________________
dense (Dense) (None, 64) 2008128
_________________________________________________________________
dense_1 (Dense) (None, 32) 2080
_________________________________________________________________
dense_2 (Dense) (None, 16) 528
_________________________________________________________________
dense_3 (Dense) (None, 1) 17
=================================================================
Total params: 2,034,481
Trainable params: 2,034,481
Non-trainable params: 0
_________________________________________________________________
我目前正在使用 Google colaboratory 进行此代码实现,此外,我的图表是使用 tensorflow 2.0 训练的
解决方案
不是直接回答您的问题,而是一种解决方法:
您可以尝试使用tf2onnx包进行转换。
流程是:
- 将模型导出为保存的模型格式。
- 将导出的保存模型转换为 ONNX。
我成功转换了提供的.h5
模型:
# Install helper packages:
!pip install tf2onnx onnx onnxruntime
# Load model from .h5 and save as Saved Model:
import tensorflow as tf
model = tf.keras.models.load_model("REDPropiaFinal.h5")
tf.saved_model.save(model, "tmp_model")
# Convert in bash:
!python -m tf2onnx.convert --saved-model tmp_model --output "REDPropiaFinal.onnx"
以上应该创建REDPropiaFinal.onnx
文件。
让我们检查推理:
# Get original output
noise = tf.random.uniform((1, *model.input_shape[1:]))
original_out = model.predict(noise)
print(original_out) # [[1.]]
# Get converted output:
import onnxruntime
onnx_session = onnxruntime.InferenceSession("REDPropiaFinal.onnx")
onnx_inputs = {onnx_session.get_inputs()[0].name: noise.numpy()}
onnx_output = onnx_session.run(None, onnx_inputs)[0]
print(onnx_output) # [[1.]]
# Assure the same:
tf.debugging.assert_near(original_out, onnx_output)
希望这有帮助!
推荐阅读
- laravel - 预定命令更新记录
- python - 将分号分隔的字符串文本文件转换为列并在 Python 中执行排序?
- assembly - 从 NASM 到 MASM
- flutter - Flutter 嵌套小部件 setState 无法按预期工作
- firebase - firebase 在 jenkins 中部署,不知道在哪里使用由 firebase login 创建的令牌:ci
- powerbi - 根据日期切片器更改共享轴/层次结构
- c# - 使用实体框架从 Cosmos Db 获取子文档
- android - 如何强制媒体流调用流?
- azure-logic-apps - How to read azure service queue message in Logic apps?
- javascript - 如何在 jquery / ajax 调用中正确传递值