加载RetinaNet模型时出现TensorFlow Keras导入报错如何解决
RetinaNet加载模型Keras接口报错解决方案
错误原因
该报错为版本不兼容导致:官方停止维护的keras-retinanet仅适配TensorFlow 2.3及以下、独立Keras 2.4.3及以下版本。高版本TensorFlow内置Keras移除了keras.utils.generic_utils.populate_dict_with_module_objects接口,同时自定义层序列化逻辑变更,后续出现的Freeze类报错也来源于此。
解决方案
方案1:固定兼容版本(最稳定,适配原始训练环境)
- 卸载现有冲突包
pip uninstall -y keras tensorflow keras-retinanet
- 安装匹配版本依赖
# CPU版本 pip install tensorflow==2.3.0 keras==2.4.3 # GPU版本对应CUDA 10.1 # pip install tensorflow-gpu==2.3.0 keras==2.4.3 pip install git+https://github.com/fizyr/keras-retinanet.git@0.5.1
- 统一导入路径,所有Keras相关导入均从
tf.keras调用,避免独立Keras和TensorFlow内置Keras冲突。
方案2:高版本TensorFlow兼容改造(无需降级TF)
- 安装社区维护的高版本TF适配分支
pip install git+https://github.com/RobinBaumann/keras-retinanet.git@tf2.10_compat
- 调整模型加载代码,显式传入自定义对象并关闭编译
from tensorflow.keras.models import load_model from keras_retinanet import losses from keras_retinanet.layers import PriorProbability, RegressionModel, FilterDetections, UpsampleLike custom_objects = { 'PriorProbability': PriorProbability, 'RegressionModel': RegressionModel, 'FilterDetections': FilterDetections, 'UpsampleLike': UpsampleLike, 'smooth_l1': losses.smooth_l1(), 'focal': losses.focal() } # 替换原有加载逻辑 model = load_model(rcnn_model_path, custom_objects=custom_objects, compile=False)
方案3:权重直接加载(适配自定义训练模型)
如果模型是自定义训练的,可直接构建网络结构后加载权重,规避序列化兼容问题:
# 注意num_classes要和预训练模型保持一致 model = models.backbone('resnet101').retinanet(num_classes=你的类别数量, weights=None) model.load_weights(rcnn_model_path, by_name=True, skip_mismatch=True)
注意事项
- 高版本TensorFlow(2.4+)已内置Keras,无需单独安装Keras包,否则会出现导入路径冲突
- 加载推理用预训练模型时建议始终携带
compile=False参数,避免训练阶段的优化器、损失函数不兼容问题
内容的提问来源于stack exchange,提问作者Ben Hendel
相关产品推荐
相关产品推荐

