Pytorch中神经网络学习率衰减方法

1. 为什么要衰减

学习率(learning rate, lr)代表梯度下降的步长,与传统智能优化算法(比如粒子群算法)类似,如果搜索步长太大有可能会跳出最优区间,如果搜索步长太小,有可能陷于局部最优值。在神经网络刚开始训练的时候,可以将学习率lr设置的大一点(比如0.01),后面随着训练代数的增加将学习率逐步减小,这样平衡了探索和开发的能力。

2. 衰减方法

参考pytorch官方文档
pytorch官方给我们提供了几个衰减函数:torch.optim.lr_scheduler.StepLR(),torch.optim.lr_scheduler.LambdaLR()torch.optim.lr_scheduler.MultiStepLR(),torch.optim.lr_scheduler.ExponentialLR(),torch.optim.lr_scheduler.CosineAnnealingLR()等,这里讲一下几个常用的,其余的请参考官方文档。

2.1 指数衰减torch.optim.lr_scheduler.ExponentialLR()

代码如下:

import matplotlib.pyplot as plt
from torch.optim import Adam, lr_scheduler
from torch import nn
import torch.nn.functional as F

# 随便定义了一个网络
class Net(nn.Module):
    def __init__(self, input_size, output_size, fc_size):
        super(Net, self).__init__()
        self.input_size = input_size
        self.output_size = output_size
        self.fc_size = fc_size
        self.l1 = nn.Linear(input_size, self.fc_size)
        self.l2 = nn.Linear(self.fc_size, output_size)

    def forward(self, x):
        x = x.view(-1, self.input_size)
        x = F.relu(self.l1(x))
        return self.l2(x)

model = Net(3,3,3)  # 给网络随便输入参数

lr_list = []        # 存储每代的学习率
LR = 0.01           # 定义初始学习率
optimizer = Adam(model.parameters(),lr = LR)  # 定义优化器
scheduler = lr_scheduler.ExponentialLR(optimizer,gamma = 0.7)  # 定义学习率控制器

for epoch in range(40):   # 训练40代
	'''这里用来训练网络'''
    optimizer.step()
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(40),lr_list,color = 'r')   # 绘制出学习率曲线
plt.show()

讲解一下上面的代码:

  • 必须先定义一个优化器,再定义定义学习率控制器绑定lr;
  • scheduler.step()必须在optimizer.step()后执行;
  • lr_scheduler.ExponentialLR(optimizer,gamma = 0.7)表示每个epoch学习率会乘以0.7,也就是会呈指数下降;
  • lr下降曲线如下图所示:
    在这里插入图片描述

2.2 固定步长衰减torch.optim.lr_scheduler.StepLR()

网络结构和导入的库都与前文一致,其余代码如下:


model = Net(3,3,3)  # 给网络随便输入参数

lr_list = []        # 存储每代的学习率
LR = 0.01           # 定义初始学习率
optimizer = Adam(model.parameters(),lr = LR)  # 定义优化器
scheduler = lr_scheduler.StepLR(optimizer,step_size=5,gamma = 0.7)
# scheduler = lr_scheduler.ExponentialLR(optimizer,gamma = 0.7)  # 定义学习率控制器
for epoch in range(40):   # 训练40代
	'''这里用来训练网络'''
    optimizer.step()
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(40),lr_list,color = 'r')   # 绘制出学习率曲线
plt.show()

讲解一下上述代码:

  • lr_scheduler.StepLR(optimizer,step_size=5,gamma = 0.7)中,step_size=5代表每5个epoch学习率进行一次衰减,衰减维原来长度的gamma倍;
  • lr下降曲线如下图所示:

在这里插入图片描述

2.3 多步长衰减 torch.optim.lr_scheduler.MultiStepLR()

网络结构和导入的库都与2.1一致,其余代码如下:

optimizer = Adam(model.parameters(),lr = LR)  # 定义优化器
scheduler = lr_scheduler.MultiStepLR(optimizer,
                    milestones=[20, 30, 32, 40, 50], gamma=0.8)
for epoch in range(50):   # 训练40代
    optimizer.step()
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(50),lr_list,color = 'r')   # 绘制出学习率曲线
plt.show()

讲解一下上述代码:

  • lr_scheduler.MultiStepLR(optimizer, milestones=[20, 30, 32, 40, 50], gamma=0.8)中,milestones代表学习率衰减的时间点,在第20、30、32、40、50代分别衰减维原来长度的gamma倍,一般用于手动调参,相比于固定步长衰减更灵活;
  • lr下降曲线如下图所示:
    在这里插入图片描述

2.4 余弦退火衰减 lr_scheduler.CosineAnnealingLR()

网络结构和导入的库都与2.1一致,其余代码如下:

lr_list = []        # 存储每代的学习率
LR = 0.01           # 定义初始学习率
optimizer = Adam(model.parameters(),lr = LR)  # 定义优化器
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=0)

# scheduler = lr_scheduler.ExponentialLR(optimizer,gamma = 0.7)  # 定义学习率控制器
for epoch in range(50):   # 训练40代
    optimizer.step()
    scheduler.step()
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(50),lr_list,color = 'r')   # 绘制出学习率曲线
plt.show()

讲解一下上述代码:

  • scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=0)中,T_max=10代表余弦函数的周期为10个epoch,eta_min=0表示余弦函数的最小值的0,最大值是开头定义的LR = 0.01 ;
  • lr下降曲线如下图所示:
    在这里插入图片描述
  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PyTorch,可以使用torch.optim.lr_scheduler模块来设置学习衰减。以下是使用StepLR调度器来设置每过一定的epoch就将学习衰减一定的倍数的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim from torch.optim.lr_scheduler import StepLR # 定义卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x # 定义数据集和优化器 train_loader = torch.utils.data.DataLoader(...) model = Net() optimizer = optim.SGD(model.parameters(), lr=0.1) # 定义学习衰减策略 scheduler = StepLR(optimizer, step_size=10, gamma=0.1) # 训练模型 for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = nn.CrossEntropyLoss()(outputs, labels) loss.backward() optimizer.step() scheduler.step() # 在每个step_size(这里为10)个epoch后,学习会乘以gamma(这里为0.1),从而实现学习衰减。 ``` 如果想使用其他的学习衰减策略,只需要更改scheduler的类型和对应的参数即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值