为什么 keras2onnx.convert_keras() 函数不断出现错误“'KerasTensor' 对象没有属性 'graph'”

Why keras2onnx.convert_keras() function keeps getting me error "'KerasTensor' object has no attribute '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 格式,

如果你想在这里看到我的模型,它是 link,我的模型接受过分析图像和区分有绘图的图像和有绘图的图像的训练。手写。最后,我的 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 包进行转换。

流向:

  1. 将模型导出为保存的模型格式。
  2. 将导出的保存模型转换为 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)

希望对您有所帮助!