本文主要为深度之眼pytorch训练营二期学习笔记,详细课程内容移步:深度之眼 https://ai.deepshare.net/index
目录
1.torch.optim.lr_scheduler.StepLR()
2.torch.optim.lr_scheduler.MultiStepLR()
3.torch.optim.lr_scheduler.ReduceLROnPlateau()
背景知识
学习率是每一次反向传播过程中梯度更新的步长大小。假如学习率一直不变,如果学习率设置的过大,每一次更新的步长就很大,更新速度虽然很快,不容易收敛到极值点(可能上一次,非常接近极小值了,但是更新的步长太大就‘跳’过去了),或者在极值点来回震荡,无法收敛到极值。但是如果学习率设置的很小,那么每一次更新只能挪动一点点,则完整的训练时间就会变得很长。
因此如果能够我们随着模型训练的推进,能够控制或者调整学习率大小,那模型说要的训练时间、模型获得的训练效果是不是就更好了呢。(前期学习率大,后期学习率小)
举例如下图:一开始学习率大,然后到了第50个epoch学习率减小,然后到100再减小,到了150再减小。(在这个过程中,也就是损失函数越靠近极小值的时候,更新的步伐就越小)
Pytorch中的学习率调整
主要的学习率调整策略都是继承这个类。
1.torch.optim.lr_scheduler.
StepLR()
功能:等间隔调整学习率
重要参数:step_size:每隔多少个调整一次,gamma:调整系数(lr = lr * gamma)
"""
答案来自深度之眼训练营学习课程
"""
import torch
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
torch.manual_seed(1)
LR = 0.1
iteration = 10
max_epoch = 200
# ------------------------------ fake data and optimizer ------------------------------
weights = torch.randn((1), requires_grad=True)
target = torch.zeros((1))
optimizer = optim.SGD([weights], lr=LR, momentum=0.9)
# ------------------------------ Step LR ------------------------------
#flag = 0
flag = 1
if flag:
scheduler_lr = optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1) # 设置学习率下降策略
lr_list, epoch_list = list(), list()
for epoch in range(max_epoch):
lr_list.append(scheduler_lr.get_lr())
epoch_list.append(epoch)
for i in range(iteration):
loss = torch.pow((weights - target), 2)
loss.backward()
optimizer.step()
optimizer.zero_grad()
scheduler_lr.step()
plt.plot(epoch_list, lr_list, label="Step LR Scheduler")
plt.xlabel("Epoch")
plt.ylabel("Learning rate")
plt.legend()
plt.show()
2.torch.optim.lr_scheduler.
MultiStepLR()
功能:给定间隔调整学习率
主要参数:
milestones:指定需要调整的epoch位置, gamma:调整系数(lr = lr * gamma)
flag = 1
if flag:
milestones = [50,80,130,150] #指定间隔
scheduler_lr = optim.lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.3)
lr_list, epoch_list = list(), list()
for epoch in range(max_epoch):
lr_list.append(scheduler_lr.get_lr())
epoch_list.append(epoch)
for i in range(iteration):
loss = torch.pow((weights - target), 2)
loss.backward()
optimizer.step()
optimizer.zero_grad()
scheduler_lr.step() #调整学习率
plt.plot(epoch_list, lr_list, label="Multi Step LR Scheduler\nmilestones:{}".format(milestones))
plt.xlabel("Epoch")
plt.ylabel("Learning rate")
plt.legend()
plt.show()
3.torch.optim.lr_scheduler.
ReduceLROnPlateau()
Keras中的学习率调整