如何修改MMOCR中DBNetpp配置启动模型微调实现损失下降
MMOCR DBNetpp预训练模型微调配置调优方案
你贴出的配置是MMOCR官方仓库中DBNetpp从头训练通用场景文本数据集的默认参数,直接用于自有数据集预训练权重微调,大概率会出现初期loss震荡、不下降甚至飙升的问题,核心诱因是学习率设置过高、缺少训练初期的训练节奏保护,需要调整的参数如下:
核心调整项(学习率&优化器相关,直接影响初始loss收敛)
- 基础学习率下调:默认
0.007的SGD学习率是8卡总batchsize 1632量级下从头训练的配置,微调预训练模型时需要降到原值的1/101/20,也就是lr=3.5e-4 ~ 7e-4区间作为初始值最稳妥。如果你的自有数据集和原预训练数据域差异极大(比如特殊工业场景文本、手写艺术字、低分辨率模糊文本),最高也不要把SGD的初始lr设到1e-3以上,否则会直接冲坏预训练好的通用特征提取权重。 - 优化器适配:如果你的自有数据集样本量低于1万张,不要用默认SGD,直接换成AdamW优化器,初始学习率设为
1e-4 ~ 3e-4,weight_decay保持1e-4即可,收敛速度和初期稳定性远好于SGD;只有样本量10万+、和原预训练数据域差异很小的场景,才适合用SGD配小学习率微调。 - 补充warmup学习率预热:默认lr配置没有预热机制,是微调初期loss异常的核心原因之一。训练前几百步需要让学习率从极小值线性升到设定的基础值,避免第一步更新幅度过大扰动预训练权重,修改后的lr配置参考:
lr_config = dict( policy="poly", power=0.9, min_lr=1e-7, by_epoch=False, warmup='linear', warmup_iters=500, # 前500个迭代步完成预热 warmup_ratio=1e-6 # 预热起始学习率为基础学习率的1e-6倍 )
- 开启梯度裁剪:默认
grad_clip=None建议修改为grad_clip=dict(max_norm=35, norm_type=2),可以拦截个别batch产生的异常大梯度,避免权重被瞬间冲飞导致loss突增。
注意:学习率需要和总batchsize等比例线性缩放,如果你微调时的总batchsize比原预训练的32小,比如总batchsize只有8,那上面给出的参考学习率也要对应降到1/4,不要硬套固定数值。
配套辅助调整项(进一步提升初期收敛稳定性)
- 训练初期冻结骨干网络前两层:微调前5~10个epoch先冻结DBNetpp骨干网络(ResNet)的前两个stage权重,只训练网络颈部、检测头和骨干深层权重,等loss稳定下降后再解冻全层训练,能大幅降低初期权重扰动。
- 权重加载校验:正式训练前先确认预训练权重完整加载了骨干、颈部的参数,若只加载了检测头权重,本质上接近半从头训练,即使设置小学习率也会出现loss长期卡滞不下降的问题。
内容的提问来源于stack exchange,提问作者aarya
相关产品推荐
相关产品推荐

