TensorFlow转ONNX失败:RFFT/FFT仅支持ComplexAbs而非Real/Imag
问题描述
尝试将TensorFlow SPICE模型通过tf2onnx转换为ONNX格式时遇到错误,执行的转换命令及错误信息如下:
转换SavedModel格式:
python -m tf2onnx.convert --saved-model .\spice --output model.onnx --opset 11 --verbose
错误日志片段:
2023-04-08 18:33:10,811 - ERROR - tf2onnx.tfonnx: Tensorflow op [Real: Real] is not supported 2023-04-08 18:33:10,812 - ERROR - tf2onnx.tfonnx: Tensorflow op [Imag: Imag] is not supported 2023-04-08 18:33:10,879 - ERROR - tf2onnx.tfonnx: Unsupported ops: Counter({'Real': 6, 'Imag': 6}) ... ValueError: make_sure failure: Current implementation of RFFT or FFT only allows ComplexAbs as consumer not {'Real', 'Imag'}
转换TensorFlow Lite模型时出现相同错误:
python -m tf2onnx.convert --opset 16 --tflite .\lite-model_spice_1.tflite --output spice.onnx
错误日志片段:
ValueError: make_sure failure: Current implementation of RFFT or FFT only allows ComplexAbs as consumer not {'Imag', 'Real'}
环境信息:Windows 11、Python 3.10.10、TensorFlow 2.12,首次接触TensorFlow/ONNX,咨询以下问题:
- 错误与TensorFlow、tf2onnx还是模型相关?
- 更换环境(如Linux或其他TF版本)能否解决?
- 如何修复该问题?
解决方案与解答
错误来源分析
这个错误核心是tf2onnx的实现限制:模型中使用了Real/Imag操作提取复数张量的实部和虚部,但当前tf2onnx对RFFT/FFT的转换逻辑仅支持后续接ComplexAbs操作,不支持直接提取实部、虚部的场景,和TensorFlow本身关系不大。更换环境能否解决
更换Linux系统大概率无效;升降TensorFlow版本也很难解决问题——因为核心限制在tf2onnx的转换逻辑里,除非新版本tf2onnx修复了该问题,或者TensorFlow对RFFT/Real/Imag的实现逻辑有本质变更(可能性极低)。修复方法
- 升级tf2onnx到最新版本:优先执行
pip install --upgrade tf2onnx,检查是否已修复Real/Imag算子的支持,或放宽了RFFT后续节点的限制。 - 修改模型结构:如果无法升级tf2onnx,可尝试修改原模型,用张量切片替代原生
Real/Imag算子——复数张量通常会将实部和虚部拼接在最后一维,直接切片即可获取对应部分。 - 自定义ONNX算子:若转换后仍有不支持的算子,可为
Real/Imag注册自定义ONNX算子,在ONNX Runtime中实现对应逻辑,但需要一定开发成本。 - 尝试其他转换工具:比如使用TensorFlow原生ONNX导出功能(若支持),或尝试ONNX-TensorFlow反向转换工具,但这类工具的兼容性通常不如tf2onnx。
内容的提问来源于stack exchange,提问作者mihca
相关产品推荐
相关产品推荐

