能否将TensorFlow 2.x生成的SavedModel/Keras模型回退适配到1.x环境加载
TensorFlow 2.x模型向下兼容TF1.x加载解决方案
核心结论
TensorFlow 2.x导出的SavedModel和Keras H5模型不能直接在TF1.x环境加载,但可以通过版本适配、格式转换等方式实现兼容运行,针对你遇到的两个报错分别对应解决方案如下:
问题1:Keras H5模型加载时报AttributeError: 'str' object has no attribute 'decode'
报错原因
- TF2.x导出的H5模型中配置字段为字符串格式,而TF1.14内置的Keras加载逻辑默认将配置字段识别为bytes类型,强制调用
decode方法导致类型不匹配 - 另一个常见诱因是环境安装的
h5py依赖版本过高,TF1.14仅兼容h5py 2.x版本
解决方案
- 优先尝试降级h5py版本:执行
pip install h5py==2.10.0后重新加载模型,多数场景可直接解决问题 - 若降级后仍报错,可在有TF2环境的设备上重新导出兼容版本的H5模型,导出代码如下:
model = load_model('keras_model.h5') model.save('keras_model_tf1_compat.h5', save_format='h5', include_optimizer=False)
将新导出的兼容版本模型拷贝到树莓派即可直接加载
问题2:SavedModel加载时报TypeError: load() missing 2 required positional arguments: 'tags' and 'export_dir'
报错原因
TF1.x和TF2.x的tf.saved_model.loadAPI参数定义完全不兼容,TF2的单参数调用写法不适用于TF1.x环境
解决方案
使用TF1.x原生的SavedModel加载逻辑编写代码,示例如下:
import tensorflow as tf with tf.Session() as sess: # 加载SavedModel,默认tag为SERVING model = tf.saved_model.load( sess, tags=[tf.saved_model.tag_constants.SERVING], export_dir='model_savedmodel' ) # 按实际模型的输入输出tensor名替换下方名称 input_tensor = sess.graph.get_tensor_by_name('input:0') output_tensor = sess.graph.get_tensor_by_name('output:0') # 推理调用示例 res = sess.run(output_tensor, feed_dict={input_tensor: your_input_data})
最优兼容方案(推荐树莓派使用)
直接将TF2模型转换为TensorFlow Lite格式,不仅兼容性最强,还能大幅提升树莓派上的推理性能
转换步骤(在TF2环境执行)
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model('model_savedmodel') # 如需量化压缩可添加对应配置 tflite_model = converter.convert() with open('model.tflite', 'wb') as f: f.write(tflite_model)
树莓派TF1.14环境加载代码
import tensorflow as tf interpreter = tf.lite.Interpreter(model_path="model.tflite") interpreter.allocate_tensors() # 获取输入输出张量配置 input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 推理示例 interpreter.set_tensor(input_details[0]['index'], 预处理后的输入数据) interpreter.invoke() output_result = interpreter.get_tensor(output_details[0]['index'])
内容的提问来源于stack exchange,提问作者axxman
相关产品推荐
相关产品推荐

