pytorch日积月累11-学习率
先使用大学习率后使用小学习率。
基类:class _LRScheduler
optimizer
:关联的优化器
last_epoch
:记录epoch数
base_lrs
:记录初始学习率
主要方法:
step()
:更新下一个epoch的学习率
get_lr()
:虚函数,计算下一个epoch的学习率
1 2 3 4
| class _LRScheduler(object): def __init__(self, optimizer, last_epoch=-1): def get_lr(self): raise NotImplementedError
|
六种学习率调整策略:
1.StepLR
1 2 3 4 5
| lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
|
2.MultiStepLR
功能:按给定间隔调整学习率
1 2 3 4
| lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
|
3.ExponentialLR
功能:按照指数衰减调整学习率
1 2 3
| lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
|
4.CosineAnnealingLR
功能:余弦周期调整学习率
1 2 3 4
| lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
|
5.ReduceLROnPlateau
功能:监控指标,当指标不再变化则调整
1 2 3 4 5 6 7 8 9 10
| lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
|
6.LambdaLR
功能:自定义调整策略
1 2 3
| lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| lr_init = 0.1 weights_1 = torch.randn((6, 3, 5, 5)) weights_2 = torch.ones((5, 5)) optimizer = optim.SGD([ {'params': [weights_1]}, {'params': [weights_2]}], lr=lr_init) lambda1 = lambda epoch: 0.1 ** (epoch // 20) lambda2 = lambda epoch: 0.95 ** epoch scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2]) lr_list, epoch_list = list(), list() for epoch in range(max_epoch): for i in range(iteration): optimizer.step() optimizer.zero_grad() scheduler.step() lr_list.append(scheduler.get_lr()) epoch_list.append(epoch) print('epoch:{:5d}, lr:{}'.format(epoch, scheduler.get_lr()))
|
学习率调整小结
有序调整:Step、MultiStep、Exponential 和 CosineAnnealing
自适应调整:ReduceLROnPleateau
自定义调整:Lambda