在 PyTorch 中,学习率调度器(scheduler)用于动态调整优化器的学习率。调度器的状态文件保存了在训练过程中与学习率调度相关的信息。具体来说,学习率调度器保留了以下类型的参数:
ReduceLROnPlateau
需要保存指标的最优值以及最近的评估值,以决定是否调整学习率。假设你使用了 StepLR
调度器,调度器保存的状态可能包括:
{
'last_epoch': 5, # 上一个已完成的 epoch
'base_lrs': [0.01], # 初始学习率
'step_size': 10, # 每隔多少步调整学习率
'gamma': 0.1 # 学习率衰减因子
}
对于 ReduceLROnPlateau
,状态可能包括:
{
'last_epoch': 5, # 上一个已完成的 epoch
'best': 0.1, # 最佳验证损失
'mode': 'min', # 监控模式('min' 或 'max')
'factor': 0.1, # 学习率减少因子
'patience': 10, # 等待多少个 epoch 后减少学习率
'cooldown': 0, # 学习率减少后的冷却期
'verbose': False # 是否打印日志
}
学习率调度器的状态文件包含了用于恢复训练时必要的所有信息,以确保学习率的调整可以从中断点继续。保存这些状态信息可以使训练过程更加稳定,并避免从头开始调整学习率。
当然,下面是一个关于如何保存和恢复 PyTorch 学习率调度器状态的示例:
假设我们正在训练一个简单的模型,并使用 StepLR
学习率调度器。在训练过程中,我们会保存模型和调度器的状态,并在恢复训练时重新加载它们。
import torch
import torch.optim as optim
import torch.nn as nn
import torch.optim.lr_scheduler as lr_scheduler
# 创建模型和优化器
model = nn.Linear(10, 1)
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
# 模拟训练过程
for epoch in range(20):
# 模拟一次训练
optimizer.step()
scheduler.step()
# 保存模型和调度器的状态
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'scheduler_state_dict': scheduler.state_dict(),
}, 'checkpoint.pth')
import torch
import torch.optim as optim
import torch.nn as nn
import torch.optim.lr_scheduler as lr_scheduler
# 创建模型和优化器
model = nn.Linear(10, 1)
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
# 加载保存的状态
checkpoint = torch.load('checkpoint.pth')
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
scheduler.load_state_dict(checkpoint['scheduler_state_dict'])
# 恢复训练时的 epoch
epoch = checkpoint['epoch']
# 继续训练
for epoch in range(epoch, epoch + 20):
# 模拟一次训练
optimizer.step()
scheduler.step()
保存状态
torch.save
保存了模型、优化器和调度器的状态,包括学习率调度器的状态(如 step_size
和 gamma
)。scheduler.state_dict()
保存了调度器的内部状态,比如当前的步数和其他参数。恢复状态
torch.load
加载了之前保存的状态字典。model.load_state_dict
, optimizer.load_state_dict
, 和 scheduler.load_state_dict
恢复了模型、优化器和调度器的状态。这样做可以确保在恢复训练时,调度器的学习率调整策略和状态保持一致,从而避免训练中断对学习率调整的影响。