深度之眼【Pytorch】--学习率调整策略

本文主要为深度之眼pytorch训练营二期学习笔记,详细课程内容移步:深度之眼 https://ai.deepshare.net/index

目录

背景知识

Pytorch学习率调整

1.torch.optim.lr_scheduler.StepLR()

2.torch.optim.lr_scheduler.MultiStepLR()

3.torch.optim.lr_scheduler.ReduceLROnPlateau()

Keras中的学习率调整


 

背景知识

学习率是每一次反向传播过程中梯度更新的步长大小。假如学习率一直不变,如果学习率设置的过大,每一次更新的步长就很大,更新速度虽然很快,不容易收敛到极值点(可能上一次,非常接近极小值了,但是更新的步长太大就‘跳’过去了),或者在极值点来回震荡,无法收敛到极值。但是如果学习率设置的很小,那么每一次更新只能挪动一点点,则完整的训练时间就会变得很长。

因此如果能够我们随着模型训练的推进,能够控制或者调整学习率大小,那模型说要的训练时间、模型获得的训练效果是不是就更好了呢。(前期学习率大,后期学习率小

举例如下图:一开始学习率大,然后到了第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中的学习率调整

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章