【PyTorch】学习率调整策略汇总


写在前面

目前pytorch中的学习率调整策略分为两种:

  • 直接修改
  • 调用lr_scheduler中封装好的类。

直接修改

修改前

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


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.main = nn.Linear(1, 1)

    def forward(self, x):
        return self.main(x)


if __name__ == "__main__":
    model = Net()
    optimizer = Adam(model.parameters(), lr=0.01)
    lr_list = []
    for epoch in range(10):
        lr = optimizer.param_groups[0]['lr']
        lr_list.append(lr)
        optimizer.step()
    plt.plot(range(10), lr_list)
    plt.show()

在这里插入图片描述
修改后(每经过一个epoch,衰减0.5个乘法因子)

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


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.main = nn.Linear(1, 1)

    def forward(self, x):
        return self.main(x)


if __name__ == "__main__":
    model = Net()
    optimizer = Adam(model.parameters(), lr=0.01)
    lr_list = []
    for epoch in range(10):
        lr = optimizer.param_groups[0]['lr']
        lr_list.append(lr)
        optimizer.step()
        optimizer.param_groups[0]['lr']*=0.5
    plt.plot(range(10), lr_list)
    plt.show()

在这里插入图片描述

lr_scheduler

自定义调整(LambdaLR)

CLASS torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)

描述

将每个参数组的学习速率设置为初始lr乘以给定函数。当last_epoch=-1,设置初始lrlr

参数

  • optimizer (Optimizer):优化器。
  • lr_lambda (function or list):给定整数参数epoch计算乘数的函数;或者一个这样的函数列表,对应于optimizer.param_groups中的每一个组。
  • last_epoch (int):上一个epoch的索引。默认是-1
  • verbose (bool):如果为True,则针对每个更新向stdout打印一条消息;默认False

示例

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


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.main = nn.Linear(1, 1)

    def forward(self, x):
        return self.main(x)


if __name__ == "__main__":
    model = Net()
    optimizer = Adam(model.parameters(), lr=0.01)
    scheduler = lr_scheduler.LambdaLR(optimizer, lambda epoch: 0.5**epoch)
    lr_list = []
    for epoch in range(10):
        lr = optimizer.param_groups[0]['lr']
        lr_list.append(lr)
        optimizer.step()
        scheduler.step()
    plt.plot(range(10), lr_list)
    plt.show()

在这里插入图片描述

等指数调整(MultiplicativeLR)

CLASS torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)

描述

将每个参数组的学习率乘以指定函数中给定的因子。当last_epoch=-1,设置初始lrlr

参数

  • optimizer (Optimizer):优化器。
  • lr_lambda (function or list):给定整数参数epoch计算乘数的函数;或者一个这样的函数列表,对应于optimizer.param_groups中的每一个组。
  • last_epoch (int):上一个epoch的索引。默认是-1
  • verbose (bool):如果为True,则针对每个更新向stdout打印一条消息;默认False

示例

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


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.main = nn.Linear(1, 1)

    def forward(self, x):
        return self.main(x)


if __name__ == "__main__":
    model = Net()
    optimizer = Adam(model.parameters(), lr=0.01)
    scheduler = lr_scheduler.MultiplicativeLR(optimizer, lambda epoch: 0.5)
    lr_list = []
    for epoch in range(10):
        lr = optimizer.param_groups[0]['lr']
        lr_list.append(lr)
        optimizer.step()
        scheduler.step()
    plt.plot(range(10), lr_list)
    plt.show()

在这里插入图片描述

等间隔调整(StepLR)

CLASS torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1, verbose=False)

描述

step_sizeepoch,通过gamma衰减所有参数组的学习率。需要注意的是,这种衰减可以与外部的学习速率变化同时发生。当last_epoch=-1,设置初始lrlr

参数

  • optimizer (Optimizer):优化器。
  • step_size (int):学习速率衰减周期。
  • gamma (float):学习速率衰减的乘法因子;默认0.1
  • last_epoch (int):上一个epoch的索引。默认是-1
  • verbose (bool):如果为True,则针对每个更新向stdout打印一条消息;默认False

示例

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


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.main = nn.Linear(1, 1)

    def forward(self, x):
        return self.main(x)


if __name__ == "__main__":
    model = Net()
    optimizer = Adam(model.parameters(), lr=0.01)
    scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
    lr_list = []
    for epoch in range(10):
        lr = optimizer.param_groups[0]['lr']
        lr_list.append(lr)
        optimizer.step()
        scheduler.step()
    plt.plot(range(10), lr_list)
    plt.show()

在这里插入图片描述

温馨提示

学习率调整策略中最为灵活的还是LambdaLR,可以自定义函数来调整学习率。比如我想实现一个复杂的调整过程:总共200epoch,前100epoch保证学习率固定且为0.01,后100epoch中学习率线性衰减直到0

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


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.main = nn.Linear(1, 1)

    def forward(self, x):
        return self.main(x)


if __name__ == "__main__":
    model = Net()
    optimizer = Adam(model.parameters(), lr=0.01)
    scheduler = lr_scheduler.LambdaLR(optimizer, lambda epoch: 1 - max(0, epoch - 100) / 100)
    lr_list = []
    for epoch in range(200):
        lr = optimizer.param_groups[0]['lr']
        lr_list.append(lr)
        optimizer.step()
        scheduler.step()
    plt.plot(range(200), lr_list)
    plt.show()

在这里插入图片描述

引用参考

https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xavier Jiezou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值