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

保存含tensorflow_hub层的Keras模型报NotImplementedError如何处理

问题修复方案

错误原因

HDF5(.h5)格式保存Keras模型时,会序列化每一层的配置信息。hub.KerasLayer仅支持传入字符串类型的handle参数(可以是TF Hub模型标识、本地SavedModel文件夹路径)时生成可序列化的配置,你当前代码提前调用hub.load()得到模型对象再传入hub.KerasLayer,这类加载完成的模型对象无法被序列化,因此抛出NotImplementedError。

修复方案

方案1:修改KerasLayer的传参,适配HDF5格式保存

根据你是否需要微调TF Hub模型,选择对应写法:

  • 无需微调TF Hub层
    直接将模型标识字符串传入hub.KerasLayer,无需提前加载:
# 删掉原来的loaded_obj = hub.load(module_url) 这行
emb = hub.KerasLayer(module_url, trainable=False)
  • 需要微调TF Hub层
    微调完成后先将TF Hub模型对象保存为本地SavedModel,再将本地路径字符串传入hub.KerasLayer:
# 微调完成后先保存hub模型
tf.saved_model.save(loaded_obj, "./fine_tuned")
# 重新构建模型时传入本地路径字符串
emb = hub.KerasLayer("./fine_tuned", trainable=False)

修改后即可正常用model.save("model.h5", include_optimizer=False)保存模型,加载时需要指定自定义层:

model = tf.keras.models.load_model("model.h5", custom_objects={"KerasLayer": hub.KerasLayer})

方案2:改用TensorFlow原生SavedModel格式保存

直接将模型保存为SavedModel文件夹格式,不需要修改原有代码,该格式会直接保存完整计算图,无需序列化层配置,适配所有场景:

# 直接保存为文件夹,不需要.h5后缀
model.save("my_saved_model", include_optimizer=False)
# 加载时直接读取文件夹即可
model = tf.keras.models.load_model("my_saved_model")

内容的提问来源于stack exchange,提问作者E.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:57:02