【问题标题】:Dimension mismatch during Keras to ONNX conversion (2D output)Keras 到 ONNX 转换期间的尺寸不匹配(2D 输出)
【发布时间】:2022-11-08 01:19:42
【问题描述】:

我观察到 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']

有什么建议么? 我究竟做错了什么? 我没有看到很多多维输出层的例子。这是原因吗?

感谢您的时间。

【问题讨论】:

    标签: python tensorflow keras onnx


    【解决方案1】:

    按照我尝试加载和运行的示例,我没有问题,它仍然有相同的结果,但我使用的是 pdb 格式。 pdb 格式是一种分子格式,包括缝合线和使用 from 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'))
    

    特定名称和类型很重要

    input_signature = [tf.TensorSpec([3, 3], tf.float32, name='input1')]
    
    #Use from_function for tf functions
    
    onnx_model, _ = tf2onnx.convert.from_keras(model, input_signature, opset=13)
    onnx.save(onnx_model, "F:\models\onnx\model.onnx")
    OR
    model.save("F:\models\onnx\modelpb")
    
    Command : python -m tf2onnx.convert --saved-model "F:modelsonnxmodelpb" --output "F:\models\onnx\model_2.onnx" --opset 13
    
    ### ( 2 ) : Load and run 
    import onnxruntime as ort
    import numpy as np
    import tensorflow as tf
    

    更改形状和类型以匹配模型

    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:	empPython	f_onnx>python onnx_verification_test_2.py
        [array([[0., 0., 0., 0.],
               [0., 0., 0., 0.],
               [0., 0., 0., 0.]], dtype=float32)]
    

    【讨论】:

    • 我不明白它与我的问题有什么关系。我对输出形状有问题,而不是他的输入。我在我的代码中展示了 output_shapes 的差异。我看不到与您的输出相关的任何内容。抱歉,我无法理解您建议我做什么。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多