You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:18:03