PyTorch中torch.optim.lr_scheduler_LRScheduler()函数的常见用法和示例
torch.optim.lr_scheduler.LRScheduler()是PyTorch中的学习率调度器的基类。它定义了一些常见的方法和属性,可以用来调整优化器中的学习率。
常见的用法有:
1. 创建LRScheduler对象:首先,我们需要创建一个LRScheduler对象,可以选择使用内置的调度器类(如StepLR、MultiStepLR、ExponentialLR等),也可以通过继承LRScheduler类来自定义一个调度器。
2. 设置优化器:接下来,我们需要将优化器对象传递给LRScheduler对象,以便它可以获取并调整优化器中的学习率。
3. 根据需要调整学习率:根据具体问题和需求,我们可以选择不同的学习率调整策略。例如,使用step_size参数指定调整学习率的步长,在每个步长之后学习率会衰减,使用gamma参数指定衰减系数。还可以使用milestones参数指定特定的里程碑,在每个里程碑处学习率会衰减为gamma倍。
4. 更新学习率:在每次迭代训练时,我们需要调用optimizer.step()方法更新模型的参数,并调用scheduler.step()方法更新学习率。
下面是一个使用torch.optim.lr_scheduler.StepLR()调度器的示例:
import torch
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
# 定义模型和优化器
model = ...
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 定义学习率调度器
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
# 迭代训练
for epoch in range(num_epochs):
# 训练一个epoch
for batch in data_loader:
optimizer.zero_grad()
loss = ...
loss.backward()
optimizer.step()
# 更新学习率
scheduler.step()
# 输出当前学习率
print(f"Epoch {epoch}: learning rate = {optimizer.param_groups[0]['lr']}")
在上面的示例中,StepLR调度器按照每个30个epoch的步长,将学习率衰减为原来的0.1倍。每次调用scheduler.step()方法时,都会更新优化器中的学习率。最后,通过打印输出optimizer.param_groups[0]['lr']可以获取当前的学习率。
除了StepLR外,PyTorch还提供了其他常见的调度器类,如:
- MultiStepLR:在指定的milestones里程碑处衰减学习率。
- ExponentialLR:以指数形式衰减学习率。
- CosineAnnealingLR:按照余弦函数的形式周期性地衰减学习率。
使用这些调度器类的方法和示例与StepLR类似,只需要根据具体需要选择合适的调度器和参数即可。
