Moh*_*mba 5 python optimization machine-learning pytorch
以下是 Pytorch 中随机权重平均的一个小工作代码,取自此处。
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)
Run Code Online (Sandbox Code Playgroud)
在此代码中,第 160 个纪元之后,swa_scheduler使用 代替通常的scheduler。意味着什么swa_lr?文件说,
通常,在 SWA 中,学习率被设置为一个较高的恒定值。SWALR 是一个学习率调度器,它将学习率退火到固定值,然后保持恒定。
optimizer?swa_lr影响学习率吗optimizer?假设在代码开始时 的学习率为optimizer初始化。那么上面的代码是否意味着前 160 个 epoch 的训练学习率为,然后剩余的 epoch 的学习率为?如果是,那么也定义为是个好主意吗?ADAM1e-41e-4swa_lr=0.05swa_lr1e-4
上面的代码是否意味着前160 个时期的训练学习率为
1e-4
不,它不会等于1e-4,在前 160 个时期内,学习率由第一个调度程序管理scheduler。这是一个初始化为torch.optim.lr_scheduler.CosineAnnealingLR. 学习率将遵循这条曲线:
对于剩余的纪元数,它将是
swa_lr=0.05
这部分是正确的,在第二部分(从 epoch 160开始)期间,优化器的学习率将由第二个调度程序处理swa_scheduler。这个被初始化为torch.optim.swa_utils.SWALR. 您可以在文档页面上阅读:
SWALR 是一个学习率调度器,它将学习率退火到固定值 [
swa_lr],然后保持恒定。
默认情况下(参见源代码),退火前的纪元数等于10。因此,从 epoch 170到 epoch 300的学习率将等于swa_lr并将保持这种状态。第二部分是:
这个完整的配置文件,即两个部分: