Класс ChainedScheduler
Класс ChainedScheduler предназначен для объединения нескольких планировщиков скорости обучения в цепочку. Он принимает список планировщиков и применяет их последовательно: после того как первый планировщик завершает свою работу, управление передаётся следующему. Это полезно, когда нужно на разных этапах обучения использовать различные стратегии изменения скорости обучения. Первым параметром конструктор принимает список экземпляров планировщиков schedulers, а вторым параметром можно передать флаг last_epoch.
Синтаксис
torch.optim.lr_scheduler.ChainedScheduler(schedulers, last_epoch=-1)
Пример
Базовый пример использования двух планировщиков: сначала LinearLR, затем CosineAnnealingLR:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import LinearLR, CosineAnnealingLR, ChainedScheduler
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
scheduler1 = LinearLR(optimizer, start_factor=0.5, total_iters=3)
scheduler2 = CosineAnnealingLR(optimizer, T_max=5)
scheduler = ChainedScheduler([scheduler1, scheduler2])
for epoch in range(8):
optimizer.step()
print(f"Epoch {epoch}: lr = {optimizer.param_groups[0]['lr']:.4f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.0500
Epoch 1: lr = 0.0750
Epoch 2: lr = 0.1000
Epoch 3: lr = 0.0809
Epoch 4: lr = 0.0309
Epoch 5: lr = 0.0000
Epoch 6: lr = 0.0309
Epoch 7: lr = 0.0809
Пример
Объединение трёх планировщиков: сначала линейное увеличение, затем постоянная скорость, затем экспоненциальное затухание:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import LinearLR, ConstantLR, ExponentialLR, ChainedScheduler
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
scheduler1 = LinearLR(optimizer, start_factor=0.1, total_iters=2)
scheduler2 = ConstantLR(optimizer, factor=0.5, total_iters=2)
scheduler3 = ExponentialLR(optimizer, gamma=0.8)
scheduler = ChainedScheduler([scheduler1, scheduler2, scheduler3])
for epoch in range(8):
optimizer.step()
print(f"Epoch {epoch}: lr = {optimizer.param_groups[0]['lr']:.4f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.0100
Epoch 1: lr = 0.0550
Epoch 2: lr = 0.0500
Epoch 3: lr = 0.0500
Epoch 4: lr = 0.0400
Epoch 5: lr = 0.0320
Epoch 6: lr = 0.0256
Epoch 7: lr = 0.0205
Пример
Применение ChainedScheduler с использованием MultiplicativeLR и CosineAnnealingWarmRestarts:
import torch
from torch.optim import Adam
from torch.optim.lr_scheduler import MultiplicativeLR, CosineAnnealingWarmRestarts, ChainedScheduler
torch.manual_seed(0)
model = torch.nn.Linear(10, 1)
optimizer = Adam(model.parameters(), lr=0.01)
lr_lambda = lambda epoch: 0.95 ** epoch
scheduler1 = MultiplicativeLR(optimizer, lr_lambda=lr_lambda)
scheduler2 = CosineAnnealingWarmRestarts(optimizer, T_0=3, T_mult=2)
scheduler = ChainedScheduler([scheduler1, scheduler2])
for epoch in range(10):
optimizer.step()
print(f"Epoch {epoch}: lr = {optimizer.param_groups[0]['lr']:.6f}")
scheduler.step()
Результат выполнения кода:
Epoch 0: lr = 0.009500
Epoch 1: lr = 0.008530
Epoch 2: lr = 0.007462
Epoch 3: lr = 0.006479
Epoch 4: lr = 0.005531
Epoch 5: lr = 0.004647
Epoch 6: lr = 0.003673
Epoch 7: lr = 0.003053
Epoch 8: lr = 0.002432
Epoch 9: lr = 0.001819
Смотрите также
-
класс
SequentialLR,
который также объединяет планировщики, но с явным указанием границ эпох -
класс
LinearLR,
который линейно изменяет скорость обучения -
класс
CosineAnnealingLR,
который изменяет скорость обучения по закону косинуса -
класс
MultiplicativeLR,
который умножает скорость обучения на заданный коэффициент