Tensorflow Lite转换报错:No module named tf.contrib.lite
解决TensorFlow Lite转换时的ImportError及冻结图转TFLite问题
我来帮你搞定这个问题!你遇到的ImportError: No module named tf.contrib.lite主要有两个原因:一是TensorFlow版本更新后,tf.contrib.lite模块已经被调整到了tf.lite下;二是你用错了转换工具——convert_savedmodel是用来转换SavedModel格式的,而你手里的是冻结的.pb图,得用对应的冻结图转换方法。
下面给你一步步的解决方案:
1. 修正模块导入与转换代码
根据你使用的TensorFlow版本,选择对应的代码:
如果你用的是TensorFlow 2.x
直接使用tf.lite.TFLiteConverter.from_frozen_graph来转换冻结图,替换你原来的代码:
#!/usr/bin/env python import sys import tensorflow as tf # 冻结图路径、输出节点名称、输出TFLite路径 frozen_graph_path = "/frozen_inference_graph.pb" output_nodes = ["your_output_node_name"] # 替换成你模型的实际输出节点名 tflite_output_path = "/TF_Lite_Model.tflite" # 初始化转换器 converter = tf.lite.TFLiteConverter.from_frozen_graph( frozen_graph_path, input_arrays=["your_input_node_name"], # 替换成模型的实际输入节点名 output_arrays=output_nodes ) # 执行转换并保存模型 tflite_model = converter.convert() with open(tflite_output_path, "wb") as f: f.write(tflite_model)
如果你用的是TensorFlow 1.x
TensorFlow 1.x中tf.contrib.lite确实存在,但你需要确保安装的是完整的TensorFlow包,同时同样要使用冻结图的转换方法(而不是SavedModel的工具):
#!/usr/bin/env python import sys import tensorflow as tf from tensorflow.contrib.lite.python import lite frozen_graph_path = "/frozen_inference_graph.pb" output_nodes = ["your_output_node_name"] tflite_output_path = "/TF_Lite_Model.tflite" converter = lite.TFLiteConverter.from_frozen_graph( frozen_graph_path, input_arrays=["your_input_node_name"], output_arrays=output_nodes ) tflite_model = converter.convert() with open(tflite_output_path, "wb") as f: f.write(tflite_model)
2. 关键注意事项
- 一定要替换代码中的
your_input_node_name和your_output_node_name:你可以用TensorBoard或者saved_model_cli工具查看冻结图的输入输出节点名称。 - 不需要用Bazel构建TOCO:现在TensorFlow已经把TFLite转换器集成到了官方包中,只要安装正确版本的TensorFlow(
pip install tensorflow或conda install tensorflow)就能直接使用。 - 确保Anaconda环境的TensorFlow版本正确:如果是旧项目需要TF 1.x,就安装
tensorflow==1.15这类稳定版本;新项目建议用TF 2.x,兼容性更好。
3. 验证转换是否成功
执行修正后的代码后,如果你得到了.tflite文件,就可以直接拿到Android项目中使用了——你可以用TensorFlow Lite的Android API加载这个模型进行推理。
内容的提问来源于stack exchange,提问作者Vancore
相关产品推荐
相关产品推荐

