PyTorch如何获取当前的学习率Learning Rate(lr)

本文探讨如何独立实现学习率调度器,不再依赖optimizer内部机制,通过实例代码展示如何从optimizer状态中获取和设置学习率,适合深度理解LR调整策略的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于种种原因, 需要自己写一个lr_scheduler,
目前主流的方法是从optimizer中获取,
代码如下:

optimizer.state_dict()['param_groups'][0]['lr']
### PyTorch 中动态调整学习率的方法 在深度神经网络训练中,学习率是一个至关重要的超参数。为了提高模型性能并加速收敛过程,可以采用多种方式动态调整学习率。以下是几种常见的方法及其示例代码。 #### ExponentialLR 学习率衰减 `ExponentialLR` 是一种指数级降低学习率的方式。每次调用 `scheduler.step()` 后,学习率会乘以预设的因子 `gamma` 进行衰减[^1]。 ```python import torch import torch.nn as nn import torch.optim as optim from torch.optim.lr_scheduler import ExponentialLR model = nn.Linear(10, 2) # 示例模型 optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = ExponentialLR(optimizer, gamma=0.9) for epoch in range(10): optimizer.zero_grad() output = model(torch.randn(5, 10)) loss = (output - torch.ones_like(output)).pow(2).mean() loss.backward() optimizer.step() scheduler.step() # 更新学习率 print(f"Epoch {epoch}, Learning Rate: {scheduler.get_last_lr()[0]}") ``` --- #### StepLR 学习率衰减 `StepLR` 可以按照固定的间隔周期性地减少学习率。每经过指定步数后,学习率会被乘以一个固定的比例因子 `gamma`[^2]。 ```python from torch.optim.lr_scheduler import StepLR optimizer = optim.Adam(model.parameters(), lr=0.01) scheduler = StepLR(optimizer, step_size=3, gamma=0.1) for epoch in range(10): optimizer.zero_grad() output = model(torch.randn(5, 10)) loss = (output - torch.ones_like(output)).pow(2).mean() loss.backward() optimizer.step() scheduler.step() # 每隔step_size个epoch更新一次学习率 print(f"Epoch {epoch}, Learning Rate: {scheduler.get_last_lr()[0]}") ``` --- #### MultiStepLR 学习率衰减 `MultiStepLR` 提供了一种更灵活的方式来定义多个特定的时间点,在这些时间点上按比例缩小学习率[^3]。 ```python from torch.optim.lr_scheduler import MultiStepLR optimizer = optim.RMSprop(model.parameters(), lr=0.01) milestones = [4, 7] # 在第4和第7个epoch处改变学习率 scheduler = MultiStepLR(optimizer, milestones=milestones, gamma=0.1) for epoch in range(10): optimizer.zero_grad() output = model(torch.randn(5, 10)) loss = (output - torch.ones_like(output)).pow(2).mean() loss.backward() optimizer.step() scheduler.step() print(f"Epoch {epoch}, Learning Rate: {scheduler.get_last_lr()[0]}") ``` --- #### ReduceLROnPlateau 基于指标变化的学习率调整 当监控到某个评价指标(如验证集损失)不再改善时,`ReduceLROnPlateau` 将自动降低学习率。 ```python from torch.optim.lr_scheduler import ReduceLROnPlateau optimizer = optim.Adagrad(model.parameters(), lr=0.01) scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=2) val_loss = float('inf') # 初始化验证集损失 for epoch in range(10): optimizer.zero_grad() output = model(torch.randn(5, 10)) train_loss = (output - torch.ones_like(output)).pow(2).mean() val_loss_new = train_loss.item() * 0.8 # 模拟验证集损失 if val_loss_new < val_loss: val_loss = val_loss_new optimizer.step() scheduler.step(val_loss) # 使用验证集损失来决定是否调整学习率 print(f"Epoch {epoch}, Learning Rate: {scheduler.optimizer.param_groups[0]['lr']}") ``` --- #### 总结 上述四种方法分别适用于不同的场景需求: - 如果希望简单实现指数级下降,则可以选择 **ExponentialLR**; - 对于定期均匀调整的情况,推荐使用 **StepLR** 或者更加复杂的多阶段版本——**MultiStepLR**; - 当需要依据实际表现动态调节时,可考虑引入外部反馈机制通过 **ReduceLROnPlateau** 实现自适应控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值