Google Colab中ONNX转TF/TF Lite遇Unsqueeze v13未实现错误求解
解决ONNX转TensorFlow时Unsqueeze v13未实现的问题
我在Google Colab中执行以下代码,试图将ONNX模型转换为TensorFlow(最终需转为TensorFlow Lite用于Android应用):
from onnx_tf.backend import prepare import onnx onnx_model_path = 'onnx_example.onnx' tf_model_path = 'model_tf' onnx_model = onnx.load(onnx_model_path) tf_rep = prepare(onnx_model) tf_rep.export_graph(tf_model_path)
运行时触发BackendIsNotSupposedToImplementIt: Unsqueeze version 13 is not implemented.错误,已确认ONNX opset版本为18,模型结构合法,求有效解决办法。
可行解决办法
降级ONNX模型的Opset版本:将模型的Opset从18降级到13及以下(比如11),onnx-tf对低版本Unsqueeze支持更完善。用ONNX内置工具修改:
import onnx from onnx import version_converter # 加载模型 model = onnx.load("onnx_example.onnx") # 转换到opset 11 converted_model = version_converter.convert_version(model, 11) # 保存转换后的模型 onnx.save(converted_model, "onnx_example_opset11.onnx")之后用这个降级后的模型重新执行转换代码。
替换onnx-tf为ONNX Runtime的TensorFlow导出功能:使用onnxruntime-tf工具,它对高版本Opset的支持更好。安装依赖后执行转换:
!pip install onnxruntime-tf from onnxruntime.tf_export import export_onnx_to_tf onnx_model_path = 'onnx_example.onnx' tf_model_path = 'model_tf' export_onnx_to_tf(onnx_model_path, tf_model_path)手动修改ONNX模型中的Unsqueeze节点:如果模型中Unsqueeze v13的逻辑和低版本一致,直接修改节点的opset版本。用ONNX的API遍历模型节点,将Unsqueeze节点的op_version改为11:
import onnx model = onnx.load("onnx_example.onnx") for node in model.graph.node: if node.op_type == "Unsqueeze" and node.domain == "" and hasattr(node, "op_version") and node.op_version == 13: node.op_version = 11 onnx.save(model, "onnx_example_unsqueeze_fixed.onnx")注:v13和v11的Unsqueeze功能一致,仅兼容性不同,修改前可确认ONNX官方文档的版本差异说明。
内容的提问来源于stack exchange,提问作者nlp
相关产品推荐
相关产品推荐

