scheduler 学习率设置
pytorch
本文字数:396 字 | 阅读时长 ≈ 1 min

scheduler 学习率设置

pytorch
本文字数:396 字 | 阅读时长 ≈ 1 min

在炼丹的过程中,学习率的调整是必不可少的,下面给出 scheduler 模块的调学习率的方法,后面会慢慢补充

调整学习率:PyTorch 官方文档

1. CyclicLR

torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None)

2. CosineAnnealingLR

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1, verbose=False)

学习率会随着 epoch 成周期性的变化,例如最大迭代次数为 100,一共有 300 个 epoch,那么前 100 个 epoch 学习率从 0.0009 降到 0,然后 100-200 个周期从 0 又升到 0.0009,200-300 个 epoch 从 0.0009 降到 0

更新公式:

$$
\eta_{t} = \eta_{min} + \frac{1}{2}(\eta_{max}-\eta_{min})(1+cos(\frac{T_{cur}}{T_{max}}\pi))
$$

import torch.optim as optim
from torch.optim import lr_scheduler
from torchvision.models import AlexNet
import matplotlib.pyplot as plt


def plot(lr_list):
    f = plt.figure()

    plt.plot(lr_list)
    plt.show()


epochs = 50
model = AlexNet()
optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-5)
scheduler = lr_scheduler.CosineAnnealingLR(optimizer, epochs, eta_min=1e-4, last_epoch=-1)
# scheduler = lr_scheduler.CosineAnnealingLR(optimizer, epochs - 10, eta_min=1e-4, last_epoch=-1)

# this zero gradient update is needed to avoid a warning message, issue #8.
optimizer.zero_grad()

lr_list = list()
for epoch in range(epochs*3):
    optimizer.step()
    scheduler.step()

    print('{} - {}'.format(epoch, scheduler.get_last_lr()))
    lr_list.append(scheduler.get_last_lr()[0])

plot(lr_list)
4月 06, 2025
3月 10, 2025
12月 31, 2024