Matterport版Mask R-CNN加载权重时anchors层报错咨询
问题背景
项目涉及细胞检测任务,计划使用Usiigaci预训练权重开展神经网络迁移学习训练,加载权重时触发如下报错:
ValueError: Layer #362 (named "anchors") expects 1 weight(s), but the saved weights have 0 element(s)
经测试,加载COCO预训练权重可正常运行,加载Usiigaci权重使用的代码如下:
model = MaskRCNN(mode='training', model_dir='./', config=config) model.load_weights('Usiigaci_3.h5', by_name=True, exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask"])
此外,加载基于自有图片数据集训练生成的权重进行断点续训时,也出现同类报错,具体报错信息为:
ValueError: Layer #362 (named "anchors"), weight <tf.Variable 'Variable:0' shape=(4, 261888, 4) dtype=float32> has shape (4, 261888, 4), but the saved weight has shape (2, 261888, 4).
加载自训练权重的代码如下:
model.load_weights('new_weigths/40_epochs/mask_rcnn_cell_cfg_0040.h5', by_name=True, exclude=["mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask"])
报错原因
两个报错的核心触发点都是anchors层权重不匹配:
anchors是Mask R-CNN中负责生成候选锚框的非训练层,权重完全由当前配置参数动态生成,不参与训练更新,不需要从权重文件中读取。- 加载Usiigaci权重报错的原因:Usiigaci版本的Mask R-CNN实现保存权重时,默认跳过了无训练参数的anchors层,权重文件中没有存储该层参数,当前模型实例加载时找不到对应权重,直接触发元素数量不匹配错误。
- 断点续训时的形状不匹配报错:当前训练配置中设置的锚框宽高比数量为4,而上次训练保存权重时使用的配置仅设置了2种锚框宽高比,两边生成的anchors层张量形状不一致,加载时触发形状不匹配错误。
解决方法
- 加载所有权重(包括第三方预训练权重、自训练断点续训权重)时,在
exclude参数列表中新增"anchors"项,跳过该层的权重加载即可。anchors层参数会在模型初始化时根据当前配置自动生成,不从权重文件读取不会对训练效果产生任何影响。
修改后的加载代码参考:# 加载Usiigaci预训练权重 model.load_weights('Usiigaci_3.h5', by_name=True, exclude=[ "mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask", "anchors" ]) # 断点续训加载自有权重 model.load_weights('new_weigths/40_epochs/mask_rcnn_cell_cfg_0040.h5', by_name=True, exclude=[ "mrcnn_class_logits", "mrcnn_bbox_fc", "mrcnn_bbox", "mrcnn_mask", "anchors" ]) - 断点续训场景下,除跳过anchors层加载外,必须保证当前使用的训练配置和上次保存权重时的配置完全一致,重点核对输入图像尺寸、锚框尺度、锚框宽高比、骨干网络步长等直接影响锚框生成的参数,避免锚框分布和已训练特征分布不匹配导致训练精度下降。
内容的提问来源于stack exchange,提问作者Avner St
相关产品推荐
相关产品推荐

