3. ONNX模型转换为TensorFlow Lite
任务说明
本案例目标是将一个已存在的ONNX模型转换为TensorFlow Lite格式,并验证转换后的TFLite模型能够正确执行推理。转换路径为:ONNX → TensorFlow(通过ONNX-TensorFlow转换器)→ TFLite(通过TensorFlow Lite Converter)。
环境依赖
- Python 3.8+
- onnx(加载ONNX模型)
- onnx-tf(ONNX转TensorFlow,需安装tensorflow 2.x)
- tensorflow 2.x(包含TFLite转换器)
- numpy(验证输入输出)
安装命令:pip install onnx onnx-tf tensorflow numpy
完整实现代码
import onnx
import tensorflow as tf
import numpy as np
from onnx_tf.backend import prepare
# ========== 1. 加载ONNX模型 ==========
onnx_model_path = "model.onnx" # 请替换为实际路径
onnx_model = onnx.load(onnx_model_path)
# ========== 2. ONNX → TensorFlow ==========
tf_rep = prepare(onnx_model) # 将ONNX模型转换为TensorFlow表示
tf_model_path = "./tf_model"
tf_rep.export_graph(tf_model_path) # 导出为SavedModel格式
# ========== 3. TensorFlow → TFLite ==========
converter = tf.lite.TFLiteConverter.from_saved_model(tf_model_path)
tflite_model = converter.convert()
# 保存TFLite模型
tflite_model_path = "model.tflite"
with open(tflite_model_path, "wb") as f:
f.write(tflite_model)
print(f"TFLite模型已保存至: {tflite_model_path}")
# ========== 4. 验证TFLite模型推理 ==========
# 加载TFLite模型
interpreter = tf.lite.Interpreter(model_path=tflite_model_path)
interpreter.allocate_tensors()
# 获取输入/输出详情
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# 构造与ONNX模型输入形状一致的随机数据
# 注意:请根据实际ONNX模型的输入形状调整
input_shape = input_details[0]['shape']
dummy_input = np.random.rand(*input_shape).astype(np.float32)
# 执行推理
interpreter.set_tensor(input_details[0]['index'], dummy_input)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print(f"输入形状: {input_shape}")
print(f"输出形状: {output_data.shape}")
print("TFLite推理执行成功")
运行与验证方法
- 将上述代码保存为
convert_onnx_to_tflite.py,并确保model.onnx文件路径正确。 - 运行命令:
python convert_onnx_to_tflite.py - 观察输出:若程序正常结束且打印“TFLite推理执行成功”,说明转换流程已完成。
- 进一步验证:将TFLite模型的输出与原始ONNX模型在相同输入下的输出进行对比,两者应高度一致(数值误差在合理范围内,通常
1e-4)。
通过条件
- 成功生成
model.tflite文件,且文件大小非零。 - TFLite模型能够加载并完成一次推理,输出张量形状与ONNX模型输出形状一致。
- 若原始ONNX模型有已知的测试输入输出对,TFLite推理结果与之匹配(允许浮点精度误差)。
常见问题
- ONNX算子不支持:若转换时报错提示某算子无法映射,可尝试升级
onnx-tf版本,或检查ONNX模型是否包含TFLite不支持的动态维度。 - 输入形状不匹配:ONNX模型可能包含动态轴(如batch维度为
None),转换后TFLite会固定为具体形状。若需动态batch,需在转换时设置converter.target_spec.supported_ops或使用tf.shape处理。 - 量化支持:本案例未启用量化。如需减小模型体积,可在转换时添加
converter.optimizations = [tf.lite.Optimize.DEFAULT],但需注意精度可能下降。