MaskRCNN剪枝后调用add_loss()报ValueError及12G显存训练COCO问题
问题1:报错是否和GPU显存大小有关?
该报错和GPU显存完全无关。
它是Keras计算图结构异常触发的错误:你对MaskRCNN剪枝的过程中,破坏了损失计算层和前置计算层的依赖关系,导致调用add_loss()插入损失节点时,Keras无法在现有计算图中找到损失计算需要的依赖节点,遍历超过阈值后抛出该错误。
可尝试的修复方向:
- 剪枝时过滤掉所有损失计算相关的前置层,不要修改这些层的结构和连接关系
- 剪枝完成后重新构建完整的模型计算图,再把剪枝后的权重加载到新图中,之后再添加损失
- 放弃动态
add_loss的写法,改为在model.compile()时直接传入损失字典绑定损失函数
问题2:训练COCO数据集的显存要求及12GB显存适配方案
基础显存要求
原生MaskRCNN(ResNet50 backbone、输入分辨率1024*1024)训练COCO数据集:
- Batch Size=1时需要约10~11GB显存
- Batch Size=2时需要约15~16GB显存
- 若使用ResNet101 backbone,对应显存需求还要增加2~3GB
12GB显存适配方案
可通过以下任意组合调整,完全可以在12GB显存上正常训练:
- 降低输入分辨率:将默认10241024降到800800,Batch Size=2可稳定运行,对精度影响极小
- 替换轻量Backbone:用ResNet18、MobileNetV2替换ResNet50,可减少40%以上的显存占用
- 开启混合精度训练:启用TensorFlow内置的
mixed_float16精度策略,可降低近50%显存占用,仅损失极少精度 - 梯度累加:单步Batch Size设为1,每累计N步梯度后再更新权重,等效实现大Batch Size训练,完全不增加显存占用
- 减少RPN候选框数量:将训练阶段RPN输出的候选框数量从默认1000降到500,可减少约1GB显存占用
- 开启梯度检查点:启用梯度检查点功能,牺牲少量训练速度换取30%~50%的显存节省
内容的提问来源于stack exchange,提问作者AmbitiousJH
相关产品推荐
相关产品推荐

