Keras到ONNX转换期间尺寸不匹配(2D输出)

xriantvc  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(191)

我在Keras到ONNX的转换中观察到尺寸不匹配。我将模型保存为.h5文件。它可以成功保存并再次加载。但是,当将其转换为ONNX模型时,我得到了不同的输出尺寸。
我想我是因为2D输出而遇到这种情况的,因为我的一个输出维度完全消失了。
正在加载Keras模型...

>>> keras_model = load_model('model_checkpoints/DGCNN_modelbest_with_noise.h5')
>>> keras_output = keras_model.output
>>> keras_output
<tf.Tensor 'dense_2/truediv_5:0' shape=(None, 432, 5) dtype=float32>

正在将Keras模型转换为ONNX...

>>> input_keras_model = 'model_checkpoints/DGCNN_modelbest_with_noise.h5'
>>> output_onnx_model = 'model_checkpoints/DGCNN_modelbest_with_noise.onnx'
>>> keras_model = load_model(input_keras_model)
>>> onnx_model = onnxmltools.convert_keras(keras_model)
>>> onnxmltools.utils.save_model(onnx_model, output_onnx_model)

正在加载ONNX模型...

>>> model = onnx.load("model_checkpoints/DGCNN_modelbest_with_noise.onnx")
>>> for _output in model.graph.output:
...     m_dict = MessageToDict(_output)
...     dim_info = m_dict.get("type").get("tensorType").get("shape").get("dim")
...     output_shape = [d.get("dimValue") for d in dim_info]
...     print(m_dict["name"])
...     print(output_shape)
...    
dense_2
[None, None, '5']

有什么建议吗?我做错了什么?我没有看到很多多维输出层的示例。这是原因吗?
感谢您抽出宝贵时间。

lc8prwob

lc8prwob1#

我没有问题以下的例子,我尝试通过加载和运行它仍然有相同的结果,但我使用的pdb格式。pdb格式是一个分子格式,其中包括缝合和使用从model.save(...)

### ( 1 ) : Save and convert
import tensorflow as tf
import tf2onnx
import onnx

model = tf.keras.Sequential()
#model.add(tf.keras.layers.InputLayer(input_shape=(1, 100, 100, 3), name='DekDee Input'))
model.add(tf.compat.v1.layers.dense(4, activation="relu", name='output1'))

名称具体且类型重要
第一个
更改形状和类型以匹配模型

input1 = np.zeros((3, 3), np.float32)
sess = ort.InferenceSession("F:\\models\\onnx\\model.onnx", providers=["CUDAExecutionProvider"])

results_ort = sess.run(["output1"], {"input1": input1})
    
    F:\temp\Python\tf_onnx>python onnx_verification_test_2.py
    [array([[0., 0., 0., 0.],
           [0., 0., 0., 0.],
           [0., 0., 0., 0.]], dtype=float32)]

相关问题