梯度下降算法需要我们指定一个学习率作为权重更新步幅的控制因子,常用的学习率有1e-2、1e-3以及1e-4等。一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。
torch.optim.lr_scheduler
模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。
学习率按照指数的形式衰减是比较常用的策略,我们首先需要确定需要针对哪个优化器执行学习率动态调整策略,也就是首先定义一个优化器:
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
定义好优化器以后,就可以给这个优化器绑定一个指数衰减学习率控制器:
ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.98)
其中参数gamma表示衰减的底数,选择不同的gamma值可以获得幅度不同的衰减曲线,如下:
import torch import torch.nn as nn from torch.optim.lr_scheduler import LambdaLR class model(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3) def forward(self, x): pass net_1 = model() optimizer_1 = torch.optim.Adam(net_1.parameters(), lr = 0.1) # scheduler_1 = LambdaLR(optimizer_1, lr_lambda=lambda epoch: 1/(epoch+1)) scheduler_1 = torch.optim.lr_scheduler.ExponentialLR(optimizer_1, gamma=0.98) print("初始化的学习率:", optimizer_1.defaults['lr']) for epoch in range(1, 11): # train optimizer_1.zero_grad() optimizer_1.step() print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr'])) scheduler_1.step()
注意学习率的调整应该放在optimizer更新之后,即scheduler_1.step()应该放在optimizer_1.step()之后
这里只是介绍了指数衰减,除此之外,学习率衰减还有多种其他策略,如
- Lambda衰减(torch.optim.lr_scheduler.LambdaLR),每次给lr乘上一个lambda值
- 固定步长的衰减(torch.optim.lr_scheduler.StepLR)
- 多步长衰减(torch.optim.lr_scheduler.MultiStepLR)
- 余弦退火衰减(torch.optim.lr_scheduler.CosineAnnealingLR)
Pytorch(十三) —— 学习率衰减
最新推荐文章于 2022-06-09 00:00:01 发布