图解Pytorch学习率衰减策略(一)

目录

写在前面

一、LinearLR

二、StepLR

三、MultiStepLR

四、ExponentialLR

五、CosineAnnealingLR

六、ReduceLROnPlateau

七、OneCycleLR


写在前面

        在深度学习中,学习率是一个非常重要的超参数,它控制了模型在每次权重更新时的步长。学习率衰减策略是指在训练过程中逐步减少学习率,从而使得模型更稳定地收敛到最优解。以下是几种常见的学习率衰减方法,以及它们的使用场景和具体实现。

一、LinearLR

        线性地调整学习率。它会根据设定的初始学习率、结束学习率和训练轮数,从初始学习率逐步线性地过渡到结束学习率。这个调度器通常用于训练开始时的学习率调整,帮助模型更稳定地收敛。

示例:

import torch
import matplotlib.pyplot as plt

# 假设模型和优化器
model = torch.nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

# 设置线性学习率调度器
scheduler = torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=1.0, end_factor=0.1, total_iters=20)

# 记录学习率
lrs = []

for epoch in range(20):
    # 模拟一次训练步骤
    optimizer.zero_grad()
    output = model(torch.randn(10))
    loss = output.sum()
    loss.backward()
    optimizer.step()

    # 更新学习率
    scheduler.step()

    # 打印和记录学习率
    lr = scheduler.get_last_lr()[0]
    print(f'Epoch {epoch + 1}: Learning Rate = {lr}')
    lrs.append(lr)

# 绘制学习率曲线
plt.plot(range(1, 21), lrs, marker='o')
plt.xlabel('Epoch')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

参数:

        start_factor: 学习率的初始缩放因子,通常是相对于初始学习率的比例。例如,如果start_factor为1.0,学习率将保持为优化器初始学习率。
        end_factor: 学习率的最终缩放因子,表示训练结束时学习率的比例。例如,如果end_factor为0.1,最终的学习率将是初始学习率的10%。
        total_iters: 迭代的总次数,即从start_factor过渡到end_factor的周期数。在这里,我们设置为20次迭代。

学习率变化曲线:

使用场景:

        很通用的方法,能适应各种任务,但大多用在简单模型。

推荐程度:推荐,简单模型可以用。

二、StepLR

  一种简单且常用的分段衰减策略,适用于大多数模型和任务。它通过在预设的步数后按固定比例衰减学习率,帮助模型在训练的不同阶段调整优化速度。

示例:

import torch
import torch.optim as optim
from torch.optim.lr_scheduler import StepLR
import matplotlib.pyplot as plt


# 创建一个简单的模型
class SimpleModel(torch.nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = torch.nn.Linear(10, 1)

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


# 初始化模型、优化器和学习率调度器
model = SimpleModel()
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 初始学习率为 0.01

# StepLR 学习率调度器
scheduler = StepLR(optimizer, step_size=2, gamma=0.9)  # 每 2 个 epoch 将学习率衰减 0.1

# 模拟一个训练过程
num_epochs = 20
num_batches = 10  # 每轮训练的批次数
lr_history = []
for epoch in range(num_epochs):
    print(f"\nEpoch {epoch + 1}/{num_epochs}")

    for batch in range(num_batches):
        # 模拟前向传递
        inputs = torch.randn(64, 10)  # 批次大小 64,特征维度 10
        targets = torch.randn(64, 1)
        outputs = model(inputs)
        loss = torch.nn.functional.mse_loss(outputs, targets)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    # 更新学习率
    scheduler.step()

    # 打印每轮的学习率
    current_lr = optimizer.param_groups[0]['lr']
    lr_history.append(current_lr)
    prin
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小殊小殊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值