Openmmlab系列中,如果整个训练过程只需要使用一个学习率调度器, 那么和 PyTorch 自带的学习率调度器没有差异。比如:
param_scheduler = MultiStepLR(optimizer, milestones=[8, 11], gamma=0.1)
如果整个训练过程需要多个调度器一起使用,只需将配置文件中的 scheduler 字段修改为一组调度器配置的列表,SchedulerStepHook 可以自动对调度器列表进行处理。比如:
param_scheduler = [
# 线性学习率预热调度器
dict(type='LinearLR',
start_factor=0.001,
by_epoch=False, # 按迭代更新学习率
begin=0,
end=50), # 预热前 50 次迭代
# 主学习率调度器
dict(type='MultiStepLR',
by_epoch=True, # 按轮次更新学习率
milestones=[8, 11],
gamma=0.1)
]
如果init_lr=4.8,那么线性学习率预热调度器在0到50个epoch,将学习率从init_lr*start_factor线性增加到init_lr。
就算调度器配置列表里面只有一个调度器,也被认定为预热调度器。
在MMSelfSup中,由于我一开始不知道调度器配置列表的用法,将上述的第二个调度器配置删掉了,导致训练过程全是线性学习率预热过程,学习率一直增加。在此记录下错误。