运行load_model加载h5模型时报keras.backend无unique_object_name属性错误
报错原因
- 核心为Keras版本不兼容:你尝试加载的
cnnCat2.h5模型由旧版本独立Keras(通常为2.3.x/2.4.x版本)训练导出,unique_object_name是旧版Keras后端的内置方法,该方法在Keras 2.10+版本、以及TensorFlow集成的tf.keras中已被移除或重命名,因此调用load_model加载旧模型时会触发属性不存在的报错。 - 次要触发场景:本地同时安装了独立Keras和TensorFlow内置Keras,导入路径冲突也可能导致该报错。
解决方法
方案1:降级Keras到匹配版本(最稳妥,无需修改业务代码)
直接安装和模型训练环境匹配的Keras、TensorFlow版本,执行以下安装命令即可:
pip install keras==2.4.3 tensorflow==2.4.1
安装完成后重新运行原代码即可正常加载模型。
方案2:添加兼容层加载(适合不想降级现有开发环境的场景)
修改导入路径和模型加载代码,手动补全缺失的unique_object_name方法:
- 首先修改依赖导入语句:
import cv2 import os import tensorflow as tf from tensorflow.keras.models import load_model import numpy as np from pygame import mixer import time
- 然后修改模型加载代码,传入自定义对象参数:
from tensorflow.keras.utils import register_keras_serializable @register_keras_serializable() def unique_object_name(name, zero_based=True): return name model = load_model('C:/Users/Henry/Downloads/Drowsiness detection/Drowsiness detection/models/cnnCat2.h5', custom_objects={'unique_object_name': unique_object_name})
方案3:重新训练模型(适合持有模型训练源码的场景)
如果你有该模型的完整训练代码,使用当前环境的Keras重新训练并导出模型,新导出的模型可以直接在当前环境加载,不会出现版本不兼容问题。
内容的提问来源于stack exchange,提问作者Henry Lewis
相关产品推荐
相关产品推荐

