load_model加载H5报ValueError: Unknown layer,因H5不保存Python逻辑,需通过custom_objects传入自定义类;加载SavedModel须指定目录而非文件;输入shape含None时需确保输入数据维度匹配;预训练模型权重需显式指定weights='imagenet'。

load_model 无法加载 H5 格式模型,报错 ValueError: Unknown layer
这是最常见问题:模型里用了自定义层、自定义函数(比如 tf.keras.layers.Lambda 带了未命名函数),或用了新版 TF 不再默认支持的旧写法。H5 文件只存结构+权重,不存 Python 逻辑,反序列化时找不到对应类就会炸。
实操建议:
- 确保所有自定义类(如
MyAttentionLayer)已在当前作用域定义,并通过custom_objects参数显式传入:model = tf.keras.models.load_model('model.h5', custom_objects={'MyAttentionLayer': MyAttentionLayer}) - 避免在
Lambda层里写lambda x: x ** 2这种匿名函数——改用tf.pow(x, 2)或封装为具名函数 - 优先用
tf格式保存(见下一条),H5 是兼容性妥协方案,不是推荐路径
用 load_model 加载 SavedModel(.pb 目录)时提示 Not a valid SavedModel
路径没指向 SavedModel 的根目录,而是误点了子文件(比如 saved_model.pb 文件本身)或拼错了路径。SavedModel 是个目录,不是单个文件。
实操建议:
- 确认路径是目录,且内含
saved_model.pb+variables/+assets/(可选):ls /path/to/my_model # 应看到 saved_model.pb 和 variables/
- 路径末尾不要加斜杠(TF 会自动处理),但也不能是文件路径:
/path/to/my_model✅,/path/to/my_model/⚠️(部分版本敏感),/path/to/my_model/saved_model.pb❌ - 如果模型是用
model.save('name', save_format='h5')保存的,就别用load_model当 SavedModel 加——格式必须匹配
加载后模型输出 shape 不对,或 predict() 报 Input tensor must be of rank 4
模型保存时没固化输入 shape(尤其动态 batch size 或 None 维度),加载后推断时维度对不上。常见于从 checkpoint + 架构代码重建的模型,而非端到端 save() 出来的。
实操建议:
- 加载后立刻检查:
print(model.input_shape) # 看是否含 None;print(model.outputs[0].shape)
- 若输入 shape 是
(None, None, None, 3),调用predict()前必须喂符合逻辑的 batch 数据,不能传单张图(除非 expand_dims) - 更稳的做法:保存前先 call 一次模型(触发 build),或显式指定
input_shape构建模型再保存
用 load_model 加载预训练模型(如 ResNet50)却提示找不到权重文件
tf.keras.applications 里的模型默认不带权重,你得显式设 weights='imagenet' 才下载并加载。直接 load_model 一个本地路径,和调用 ResNet50() 是两码事——后者是新建架构,前者是恢复已保存模型。
实操建议:
- 要加载官方预训练权重,走标准 API:
model = tf.keras.applications.ResNet50(weights='imagenet')
,不是load_model - 如果你自己微调并保存了该模型(比如
model.save('my_resnet')),那才用load_model('my_resnet') - 注意网络代理或防火墙可能拦截
weights='imagenet'的自动下载,此时会卡住或报 HTTP 错误,需配好TF_KERAS_DOWNLOAD_DIR环境变量或手动放权重文件
模型保存格式、自定义逻辑、输入 shape 固化这三件事混在一起时,最容易漏掉其中一环。尤其是边改模型边保存,又换环境加载,连路径权限、TF 版本小号差异都可能成为最后一根稻草。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











