1.CosineAnnealingLR
公式:
n_min,n_max是最小和最大学习率
T_cur是从上次重启后的epoch计数(到达最低点后即重启)
T_max是经过多少个epochs重启
pytorch 函数:
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1, verbose=False)
eta_min即 n_min
optimizer提供初始学习率,即最大学习率
T_max同上
last_epoch即上次重启的epoch索引
例子:
下图中T_max=10, eta_min=0
下图中T_max=20, eta_min=0.5
参考:
CosineAnnealingLR — PyTorch 1.12 documentation
❖PyTorch CosineAnnealingLR - 知乎 (zhihu.com)
CosineAnnealingLR 代码解析与公式推导 - 知乎 (zhihu.com)
2.CosineAnnealingWarmRestarts
公式:
不同之处在于T_i而不是T_max,每次重启之后的T_max是不一样的
pytorch 函数:
torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=- 1, verbose=False)
函数名跟CosinAnnealingLR()相近,参数有两个不一样,T_0就是初始restart的epoch数目,T_mult就是重启之后因子,默认是1。我觉得可以这样理解,每个restart后,T_0 = T_0 * T_mult。
例子:
T_mult=2,T_0=5, initial_lr = 0.1(最小值为0,图有点没画好)
用法:在每个iteration结束时条用scheduler.step(),参数可以是小数
>>> scheduler = CosineAnnealingWarmRestarts(optimizer, T_0, T_mult) >>> iters = len(dataloader) >>> for epoch in range(20): >>> for i, sample in enumerate(dataloader): >>> inputs, labels = sample['inputs'], sample['labels'] >>> optimizer.zero_grad() >>> outputs = net(inputs) >>> loss = criterion(outputs, labels) >>> loss.backward() >>> optimizer.step() >>> scheduler.step(epoch + i / iters)
参考:
CosineAnnealingWarmRestarts — PyTorch 1.12 documentation
torch.optim.lr_scheduler:调整学习率之CosineAnnealingWarmRestarts()参数说明_qq_37612828的博客-CSDN博客
PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR_zisuina_2的博客-CSDN博客