使用ONNX转换PyTorch模型为Keras格式时报根作用域名非法错误如何修复
PyTorch通过ONNX转换Keras格式scope名校验报错修复
问题场景
- 基于ONNX实现PyTorch模型到Keras模型的格式转换,复现教程示例代码时,在ONNX转Keras步骤触发运行错误
- 核心报错信息如下:
ValueError: 'onnx::Add_6_reshape/' is not a valid root scope name. A root scope name has to match the following pattern: ^[A-Za-z0-9.][A-Za-z0-9_.\/>-]*$
故障原因
报错来自onnx2keras转换库的节点名校验逻辑:PyTorch导出的部分ONNX节点名称末尾携带了非法的尾部斜杠/,旧版本onnx2keras没有做对应的名称清洗,直接将不符合正则规则的名称传入scope校验环节,最终抛出异常。
修复方案
按优先级尝试以下方案即可解决:
- 升级onnx2keras到最新版本:旧版本的节点命名兼容逻辑存在遗漏,新版本已经补充了尾部斜杠的自动清洗逻辑,直接执行升级命令即可:
pip install --upgrade onnx2keras - 手动清洗ONNX节点名称:如果升级后仍存在同类报错,可以在加载ONNX模型后、传入转换接口前,手动遍历所有节点移除名称尾部的非法斜杠,参考代码如下:
import onnx from onnx2keras import onnx_to_keras # 加载导出的ONNX模型 onnx_model = onnx.load("your_pytorch_exported.onnx") # 遍历所有节点清洗非法尾部斜杠 for node in onnx_model.graph.node: node.name = node.name.rstrip("/") # 执行常规转换逻辑即可 keras_model = onnx_to_keras(onnx_model, input_names=["your_model_input_name"]) - 调整PyTorch导出ONNX的参数:导出时将opset版本指定为11,关闭自定义节点命名相关的实验性参数,从导出环节避免生成非法格式的节点名,导出示例代码片段:
torch.onnx.export( model, dummy_input, "model.onnx", export_params=True, opset_version=11, do_constant_folding=True, input_names=["input"], output_names=["output"] )
内容的提问来源于stack exchange,提问作者mrastikerdar
相关产品推荐
相关产品推荐

