在NVIDIA NGC TensorFlow容器中转换TensorFlow模型至ONNX失败
解决TensorFlow转ONNX时的
explicit_paddings空迭代器错误 问题场景
按照Triton推理服务器教程将TensorFlow的EAST文本检测模型转换为ONNX格式时,使用NVIDIA NGC TensorFlow 22.01容器执行转换命令失败,核心错误为Could not infer attribute explicit_paddings type from empty iterator,对应出错节点为resnet_v1_50/conv1/Conv2D。
执行步骤
本地环境操作:
wget https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz tar -xvf frozen_east_text_detection.tar.gz docker run -it --gpus all -v ${PWD}:/workspace nvcr.io/nvidia/tensorflow:22.01-tf2-py3
容器内操作:
pip install -U tf2onnx python -m tf2onnx.convert --input frozen_east_text_detection.pb --inputs "input_images:0" --outputs "feature_fusion/Conv_7/Sigmoid:0","feature_fusion/concat_3:0" --output detection.onnx
核心错误信息
2023-11-19 10:20:17,650 - ERROR - pass1 convert failed for name: "resnet_v1_50/conv1/Conv2D" ... ValueError: Could not infer attribute `explicit_paddings` type from empty iterator
错误原因
冻结的TensorFlow模型中,Conv2D节点包含了一个空的explicit_paddings属性列表,而ONNX的helper函数无法从空迭代器推断出该属性的数据类型,导致转换流程中断。
解决方法
方案1:降级tf2onnx版本
该空属性处理问题在tf2onnx 1.14.0版本中不存在,降级到对应版本即可规避:
pip uninstall -y tf2onnx pip install tf2onnx==1.14.0
重新执行原转换命令即可完成转换。
方案2:修改冻结图,移除空属性
通过TensorFlow API加载冻结图,移除Conv2D节点中的空explicit_paddings属性后重新保存模型:
import tensorflow as tf # 加载原始冻结图 with tf.io.gfile.GFile('frozen_east_text_detection.pb', 'rb') as f: graph_def = tf.compat.v1.GraphDef() graph_def.ParseFromString(f.read()) # 遍历节点,过滤空的explicit_paddings属性 for node in graph_def.node: if node.op == 'Conv2D': filtered_attrs = [] for attr in node.attr: if attr.key == 'explicit_paddings' and len(attr.value.list.i) == 0: continue filtered_attrs.append(attr) node.attr[:] = filtered_attrs # 保存修改后的模型 with tf.io.gfile.GFile('modified_frozen_model.pb', 'wb') as f: f.write(graph_def.SerializeToString())
使用修改后的模型执行转换:
python -m tf2onnx.convert --input modified_frozen_model.pb --inputs "input_images:0" --outputs "feature_fusion/Conv_7/Sigmoid:0","feature_fusion/concat_3:0" --output detection.onnx
方案3:指定较低的ONNX opset版本
尝试使用opset 13或更低版本进行转换,旧版本ONNX对padding属性的处理逻辑不同,可避免该错误:
python -m tf2onnx.convert --input frozen_east_text_detection.pb --inputs "input_images:0" --outputs "feature_fusion/Conv_7/Sigmoid:0","feature_fusion/concat_3:0" --output detection.onnx --opset 13
内容的提问来源于stack exchange,提问作者shijie xu
相关产品推荐
相关产品推荐

