EfficientNetB0加载本地预训练h5权重时报层数不匹配错误如何解决
报错根因
你使用的Keras 2.6.0版本内置的EfficientNetB0网络结构,和你下载的h5权重对应的旧版本结构存在细微差异:2.6.0版本的EfficientNet默认新增了1层内置预处理层,所以模型总层数为131层,而你下载的权重对应旧版本结构没有该预处理层,总层数为130层,因此出现层数不匹配报错。
解决方法
按以下两种方案任选其一即可:
方案1:按层名匹配加载权重
初始化无权重的模型后,加载权重时添加by_name=True参数,仅匹配名称一致的核心层权重,自动跳过不匹配的新增层,代码修改如下:
from tensorflow.keras.applications import EfficientNetB0 from tensorflow.keras.layers import Input # 先初始化无预训练权重的基础模型 basemodel = EfficientNetB0(weights=None, include_top=False, input_tensor=Input(shape=(224,224,3))) # 加载本地权重,按层名匹配,跳过结构不匹配的层 basemodel.load_weights(r"C:\path\filename.h5", by_name=True)
该方案不会影响核心特征提取层的权重加载,对模型效果几乎无影响。
方案2:对齐模型结构
如果不想跳过层,可关闭2.6.0版本EfficientNet默认开启的内置预处理层,和旧版本权重的结构完全对齐后直接加载权重:
from tensorflow.keras.applications import EfficientNetB0 from tensorflow.keras.layers import Input basemodel = EfficientNetB0( weights=None, include_top=False, input_tensor=Input(shape=(224,224,3)), # 关闭内置预处理层,和旧版本结构完全匹配 include_preprocessing=False ) # 无需加by_name参数即可直接加载权重 basemodel.load_weights(r"C:\path\filename.h5")
使用该方案需要注意:你需要自行在数据输入前添加对应的数据预处理逻辑,避免精度下降。
注意事项
- 两种方案都不会影响EfficientNetB0的特征提取能力
- 如果你本身已经在数据pipeline中实现了归一化等预处理步骤,优先选择方案2,避免重复预处理
内容的提问来源于stack exchange,提问作者Vadivel Vadivel
相关产品推荐
相关产品推荐

