【发布时间】:2021-10-13 23:41:27
【问题描述】:
以下是 Pytorch 中随机权重平均的小工作代码,取自 here。
loader, optimizer, model, loss_fn = ...
swa_model = torch.optim.swa_utils.AveragedModel(model)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=300)
swa_start = 160
swa_scheduler = SWALR(optimizer, swa_lr=0.05)
for epoch in range(300):
for input, target in loader:
optimizer.zero_grad()
loss_fn(model(input), target).backward()
optimizer.step()
if epoch > swa_start:
swa_model.update_parameters(model)
swa_scheduler.step()
else:
scheduler.step()
# Update bn statistics for the swa_model at the end
torch.optim.swa_utils.update_bn(loader, swa_model)
# Use swa_model to make predictions on test data
preds = swa_model(test_input)
在第 160 个 epoch 之后的代码中,swa_scheduler 被使用,而不是通常的 scheduler。 swa_lr 是什么意思? documentation 说,
通常,在 SWA 中,学习率设置为较高的常数值。 SWALR 是一个学习率调度器,它将学习率退火到一个固定值,然后保持不变。
- 那么在第 160 个 epoch 之后,
optimizer的学习率会发生什么变化? -
swa_lr会影响optimizer的学习率吗?
假设在代码的开头optimizer 是ADAM 初始化为1e-4 的学习率。那么上面的代码是否暗示对于前 160 个 epoch,训练的学习率将是 1e-4,然后对于剩余的 epoch 数,它将是 swa_lr=0.05?如果是,将swa_lr 也定义为1e-4 是否是个好主意?
【问题讨论】:
标签: python machine-learning optimization pytorch