将.onnx模型转换为TensorFlow Lite时出现AttributeError错误求助
解决ONNX转TensorFlow Lite时的AttributeError: module 'tensorflow.python.framework.type_spec' has no attribute '_NAME_TO_TYPE_SPEC'
这个错误是onnx-tf库与你当前安装的TensorFlow版本不兼容导致的。_NAME_TO_TYPE_SPEC是TensorFlow内部的私有属性,新版本TensorFlow已经移除或重命名了它,但旧版onnx-tf仍在尝试调用该属性。
下面是几个可行的解决办法:
办法1:安装兼容版本的TensorFlow和onnx-tf
卸载当前的TensorFlow,安装与onnx-tf适配的旧版本,比如TensorFlow 2.10.x搭配onnx-tf 1.10.0:
pip uninstall tensorflow -y pip install tensorflow==2.10.1 pip install onnx-tf==1.10.0
安装完成后重新运行你的转换代码即可。
办法2:改用TensorFlow官方工具链转换
跳过onnx-tf,直接用tf2onnx和tf.lite.TFLiteConverter完成转换,代码如下:
import os import tensorflow as tf import tf2onnx # 定义路径 input_path = "model.onnx" output_savedmodel_path = "saved_model" output_tflite_path = "output_model.tflite" try: if not os.path.exists(input_path): raise FileNotFoundError(f"ONNX模型未找到: {input_path}") # 将ONNX模型转换为TensorFlow SavedModel格式 _, _ = tf2onnx.convert.from_onnx(input_path, output_path=output_savedmodel_path) # 将SavedModel转换为TFLite格式 converter = tf.lite.TFLiteConverter.from_saved_model(output_savedmodel_path) tflite_model = converter.convert() # 保存最终的TFLite模型 with open(output_tflite_path, "wb") as f: f.write(tflite_model) print("转换成功!") except Exception as e: print(f"转换出错: {e}") raise
办法3:用ONNX Runtime间接转换(备选)
如果前两种方法有问题,可以通过ONNX Runtime先把模型转为Keras模型,再转TFLite:
import onnxruntime as ort import tensorflow as tf input_path = "model.onnx" output_tflite_path = "output_model.tflite" # 加载ONNX模型并获取输入输出信息 sess = ort.InferenceSession(input_path) input_info = sess.get_inputs() output_names = [out.name for out in sess.get_outputs()] # 构建对应的Keras模型 inputs = [tf.keras.Input(shape=inp.shape[1:], name=inp.name) for inp in input_info] def run_onnx(inputs): feed_dict = {inp.name: inputs[i].numpy() for i, inp in enumerate(input_info)} return sess.run(output_names, feed_dict) outputs = tf.keras.layers.Lambda(run_onnx)(inputs) model = tf.keras.Model(inputs=inputs, outputs=outputs) # 转换为TFLite模型 converter = tf.lite.TFLiteConverter.from_keras_model(model) tflite_model = converter.convert() with open(output_tflite_path, "wb") as f: f.write(tflite_model) print("转换完成!")
内容的提问来源于stack exchange,提问作者rayen
相关产品推荐
相关产品推荐

