admin 管理员组

文章数量: 1086866

Pytorch动态调整学习率

转载自:.php/archives/32/?igdyxo=ebpne2,本文只做个人记录学习使用,版权归原作者所有。

1.自定义根据epoch改变学习率

def adjust_learning_rate(optimizer, epoch):"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""lr = args.lr * (0.1 ** (epoch // 30))for param_group in optimizer.param_groups:param_group['lr'] = lr

注释:在调用此函数时需要输入所用的 optimizer 以及对应的 epoch ,并且 args.lr 作为初始化的学习率也需要给出。

使用代码示例:

optimizer = torch.optim.SGD(model.parameters(),lr = args.lr,momentum = 0.9)
for epoch in range(10):adjust_learning_rate(optimizer,epoch)train(...)validate(...)

2.针对模型的不同层设置不同的学习率

当我们在使用预训练的模型时,需要对分类层进行单独修改并进行初始化,其他层的参数采用预训练的模型参数进行初始化,这个时候我们希望在进行训练过程中,除分类层以外的层只进行微调,不需要过多改变参数,因此需要设置较小的学习率。而改正后的分类层则需要以较大的步子去收敛,学习率往往要设置大一点以 resnet101 为例,分层设置学习率。

model = torchvision.models.resnet101(pretrained=True)
large_lr_layers = list(map(id,model.fc.parameters()))
small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
optimizer = torch.optim.SGD([{"params":large_lr_layers},{"params":small_lr_layers,"lr":1e-4}],lr = 1e-2,momenum=0.9)

注:large_lr_layers 学习率为 1e-2,small_lr_layers 学习率为 1e-4,两部分参数共用一个 momenum

3.根据具体需要改变学习率

class torch.optim.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)

以acc为例,当model设置为"max"时,如果acc在给定patience内没有提升,则以factor的倍率降低lr

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'max',verbose=1,patience=3)
for epoch in range(10):train(...)val_acc = validate(...)# 降低学习率需要在给出 val_acc 之后scheduler.step(val_acc)

4.手动设置lr衰减区间

def adjust_learning_rate(optimizer, lr):for param_group in optimizer.param_groups:param_group['lr'] = lrfor epoch in range(60):        lr = 30e-5if epoch > 25:lr = 15e-5if epoch > 30:lr = 7.5e-5if epoch > 35:lr = 3e-5if epoch > 40:lr = 1e-5adjust_learning_rate(optimizer, lr)

5.余弦退火

epochs = 60
optimizer = optim.SGD(model.parameters(),lr = config.lr,momentum=0.9,weight_decay=1e-4) 
scheduler = lr_scheduler.CosineAnnealingLR(optimizer,T_max = (epochs // 9) + 1)
for epoch in range(epochs):scheduler.step(epoch)

目前最常用的也就这么多了,当然也有很多其他类别,详情见 how-to-adjust-learning-rate

参考文献

  • how-to-adjust-learning-rate
  • adjust_lr

本文标签: Pytorch动态调整学习率