使用tf2onnx导出TensorFlow/Keras模型至ONNX时遇报错求助
TensorFlow/Keras模型转ONNX时
explicit_paddings错误的解决方法 问题详情
模型结构
Model: "sequential_6" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= rescaling_6 (Rescaling) (None, 256, 256, 1) 0 conv2d_18 (Conv2D) (None, 256, 256, 16) 160 max_pooling2d_18 (MaxPooli (None, 128, 128, 16) 0 ng2D) conv2d_19 (Conv2D) (None, 128, 128, 32) 4640 max_pooling2d_19 (MaxPooli (None, 64, 64, 32) 0 ng2D) conv2d_20 (Conv2D) (None, 64, 64, 64) 18496 max_pooling2d_20 (MaxPooli (None, 32, 32, 64) 0 ng2D) flatten_6 (Flatten) (None, 65536) 0 dense_12 (Dense) (None, 128) 8388736 dense_13 (Dense) (None, 904) 116616 ================================================================= Total params: 8528648 (32.53 MB) Trainable params: 8528648 (32.53 MB) Non-trainable params: 0 (0.00 Byte) _________________________________________________________________
导出代码
onnx_model, _ = tf2onnx.convert.from_keras(model, output_path="model.onnx")
错误信息
WARNING:tf2onnx.tf_loader:Could not search for non-variable resources. Concrete function internal representation may have changed. ERROR:tf2onnx.tf_utils:pass1 convert failed for name: "sequential_6/conv2d_18/Conv2D" op: "Conv2D" input: "sequential_6/rescaling_6/add" input: "sequential_6/conv2d_18/Conv2D/ReadVariableOp" ... , ex=Could not infer attribute `explicit_paddings` type from empty iterator
解决步骤
升级tf2onnx到最新版本
旧版本的tf2onnx可能对部分TensorFlow层的支持存在缺陷,执行以下命令升级:!pip install --upgrade tf2onnx显式指定输入签名
动态输入形状可能导致转换时无法正确推断padding参数,给模型指定明确的输入张量规格:import tensorflow as tf import tf2onnx # 定义匹配模型输入的签名 input_signature = [tf.TensorSpec([None, 256, 256, 1], tf.float32, name="input")] onnx_model, _ = tf2onnx.convert.from_keras( model, input_signature=input_signature, output_path="model.onnx" )先保存为SavedModel再转换
绕过Keras直接转换的兼容性问题,先将模型保存为TensorFlow官方的SavedModel格式,再用tf2onnx命令行工具转换:# 保存模型到本地目录 model.save("saved_model_dir")执行命令行转换:
!python -m tf2onnx.convert --saved-model saved_model_dir --output model.onnx检查Conv2D层的padding设置
如果模型中Conv2D层使用了padding="explicit"或自定义padding配置,尝试改为"same"或"valid"这类标准padding类型,更易被tf2onnx兼容:# 示例:修改Conv2D层的padding参数 tf.keras.layers.Conv2D(16, (3,3), padding="same", activation="relu")
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

