一、为什么要调整学习率
学习率(learning rate): 控制更新的步伐
梯度下降: w i + 1 = w i − L R ∗ g ( w i ) w_{i+1} = w_i-LR * g(w_i) wi+1=wi−LR∗g(wi)
学习率是用来控制更新的步伐,学习率一般前期大后期小,到后期需要调整学习率,让loss逐渐下降到收敛,就如同打高尔夫球,前期大力挥杆,使球到洞口附近,后期接近洞口的时候就需要调整小力度
二、pytorch的六种学习率调整策略
2.1 LRScheduler
class LRScheduler(object):
def __init__(self, optimizer, last_epoch=-1):
def get_lr(self):
raise NotImplementedError
功能:pytorch的六种学习率调整策略方法的基类
主要属性:
- optimizer: 关联的优化器
- last_epoch: 记录epoch数
- base_lrs: 记录初始学习率
主要方法:
- step(): 更新下一个epoch的学习率,在epoch的for循环处使用
- getIr(): 虚函数,计算下一个epoch的学习率
2.2 StepLR
lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
功能: 等间隔调整学习率
主要参数:
- step_size:调整间隔数
- gamma: 调整系数
调整方式: Ir =Ir * gamma
# -*- coding:utf-8 -*-
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)
# ------------------------------ 1 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.