前言
mmcv / mmDetection / mmSegmentation 的官方文档讲的很粗略(2022-04-23), 故写一篇来总结用法。
注: 举例的迭代方式为iter, 使用epoch的话其实是一样的。
版本信息
mmcv 1.4.8
mmsegmentation 0.23.0
注意:该版本较旧,可能与最新版本有较大差异。
下降策略
mmcv中的学习率下降策略有如下几种, 以Hook形式实现, 源码位置在mmcv\runner\hooks\lr_updater.py
https://github.com/open-mmlab/mmcv/blob/9fffcbc9cdc79736b866d17d0243f4eef7b7cadf/mmcv/runner/hooks/lr_updater.py
固定学习率 FixedLrUpdater
学习率固定不下降
阶梯下降 StepLrUpdater
阶梯下降, 需要如下参数:
step 为int或list(int) 单位为iter, 若为int则代表每个阶梯的长度; 若为list(int)则为每个阶梯的位置。
gamma float, 默认为0.1, 每个阶梯对学习率的乘数。
min_lr float, 默认为None, 最小学习率。
第 i
step 的学习率将为base_lr * (gamma**i)
指数下降 ExpLrUpdater
指数下降
gamma float, 指数的底数。
第 i
iter 的学习率将为base_lr * gamma**i
用法:
线性下降 PolyLrUpdater
线性下降, 与其他方式不同, 线性下降与最大iter数密切相关。
power float, 默认为1., 指数。
min_lr float, 默认为0., 最小学习率。
第 i
iter 的学习率将为(base_lr - min_lr) * (1 - i/max_iter)**power + min_lr
反函数下降 InvLrUpdater
反函数下降
gamma float, 底数。
power float, 默认为1., 指数。
第 i
iter 的学习率将为base_lr * (1 + gamma * i)**(-power)
余弦退火 CosineAnnealingLrUpdater
余弦退火, 该方法也与最大iter数密切相关。
min_lr float, 默认为None, 目标学习率(target_lr)。
min_lr_ratio float, 默认为None, 目标学习率比率, 如指定则目标学习率(target_lr)为基础学习率乘以该比例, 将会覆盖min_lr的设置。
第 i
iter 的学习率将为end + 0.5 * weight * (base_lr - target_lr) * cos(pi * i/max_iter) + 1
target_lr + 0.5 * (base_lr - target_lr) * cos(pi * i/max_iter) + 1
其他
其他的就不一一列举了, 感兴趣的去看源码: mmcv\runner\hooks\lr_updater.py
配置方法
列举2种常用的学习率下降策略配置方法:
阶梯下降
lr_config = dict(policy='step',
step=5000, # 每 5000 iter 学习率*0.1
min_lr=1e-8,
by_epoch=False)
指数下降
lr_config = dict(policy='exp',
gamma=0.99954, # 0.1**(1/5000) # 近似每 5000 iter 学习率*0.1
by_epoch=False)
余弦退火
lr_config = dict(policy='CosineAnnealing',
min_lr=1e-8,
by_epoch=False)