Класс SequentialLR
Класс SequentialLR из модуля torch.optim.lr_scheduler позволяет объединять несколько планировщиков скорости обучения в последовательную цепочку.
Первый планировщик управляет скоростью обучения на начальном этапе, а по достижении указанного количества эпох или итераций управление передаётся следующему планировщику.
В качестве первого параметра передаётся оптимизатор, вторым параметром - список планировщиков, третьим параметром - список границ переключения.
Синтаксис
torch.optim.lr_scheduler.SequentialLR(
optimizer,
schedulers,
milestones,
last_epoch=-1,
verbose=False
)
Параметры:
-
optimizer- оптимизатор, скорость обучения которого будет изменяться. -
schedulers- список планировщиков, которые будут применяться последовательно. -
milestones- список целых чисел, указывающих количество эпох, после которых происходит переход к следующему планировщику. -
last_epoch- последняя эпоха (по умолчанию-1). -
verbose- еслиTrue, выводит сообщения при каждом обновлении скорости обучения (по умолчаниюFalse).
Пример
Давайте создадим последовательность из двух планировщиков: сначала StepLR, затем ExponentialLR:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import StepLR, ExponentialLR, SequentialLR
# Создаём модель и оптимизатор
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
# Создаём планировщики
scheduler1 = StepLR(optimizer, step_size=5, gamma=0.5)
scheduler2 = ExponentialLR(optimizer, gamma=0.9)
# Объединяем их в цепочку
scheduler = SequentialLR(
optimizer,
schedulers=[scheduler1, scheduler2],
milestones=[10]
)
# Симулируем обучение на 15 эпох
for epoch in range(1, 16):
# ... шаг обучения ...
scheduler.step()
print(f"Эпоха {epoch}: lr = {optimizer.param_groups[0]['lr']:.6f}")
Результат выполнения кода:
Эпоха 1: lr = 0.100000
Эпоха 2: lr = 0.100000
Эпоха 3: lr = 0.100000
Эпоха 4: lr = 0.100000
Эпоха 5: lr = 0.100000
Эпоха 6: lr = 0.050000
Эпоха 7: lr = 0.050000
Эпоха 8: lr = 0.050000
Эпоха 9: lr = 0.050000
Эпоха 10: lr = 0.050000
Эпоха 11: lr = 0.045000
Эпоха 12: lr = 0.040500
Эпоха 13: lr = 0.036450
Эпоха 14: lr = 0.032805
Эпоха 15: lr = 0.029525
Пример
Теперь создадим цепочку из трёх планировщиков с двумя границами переключения:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import (
StepLR, ExponentialLR, CosineAnnealingLR, SequentialLR
)
# Создаём модель и оптимизатор
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
# Создаём три различных планировщика
scheduler1 = StepLR(optimizer, step_size=5, gamma=0.5)
scheduler2 = ExponentialLR(optimizer, gamma=0.95)
scheduler3 = CosineAnnealingLR(optimizer, T_max=10)
# Объединяем их в цепочку
scheduler = SequentialLR(
optimizer,
schedulers=[scheduler1, scheduler2, scheduler3],
milestones=[10, 20]
)
# Симулируем обучение на 30 эпох
for epoch in range(1, 31):
scheduler.step()
print(f"Эпоха {epoch:2d}: lr = {optimizer.param_groups[0]['lr']:.6f}")
Результат выполнения кода (фрагмент):
Эпоха 1: lr = 0.100000
Эпоха 2: lr = 0.100000
...
Эпоха 9: lr = 0.100000
Эпоха 10: lr = 0.100000
Эпоха 11: lr = 0.095000
...
Эпоха 19: lr = 0.066981
Эпоха 20: lr = 0.063632
Эпоха 21: lr = 0.097888
...
Эпоха 30: lr = 0.000000
Пример
Использование SequentialLR с флагом verbose для отладки:
import torch
from torch.optim import SGD
from torch.optim.lr_scheduler import StepLR, ExponentialLR, SequentialLR
# Создаём модель и оптимизатор
model = torch.nn.Linear(10, 1)
optimizer = SGD(model.parameters(), lr=0.1)
# Создаём планировщики с включённым verbose
scheduler1 = StepLR(optimizer, step_size=5, gamma=0.5, verbose=True)
scheduler2 = ExponentialLR(optimizer, gamma=0.9, verbose=True)
# Объединяем их в цепочку
scheduler = SequentialLR(
optimizer,
schedulers=[scheduler1, scheduler2],
milestones=[10],
verbose=True
)
# Симулируем обучение на 12 эпох
for epoch in range(1, 13):
scheduler.step()
Результат выполнения кода:
Epoch 5: reducing learning rate of group 0 to 5.0000e-02.
Epoch 10: reducing learning rate of group 0 to 2.5000e-02.
Epoch 11: reducing learning rate of group 0 to 2.2500e-02.
Epoch 12: reducing learning rate of group 0 to 2.0250e-02.
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения через фиксированные интервалы -
класс
ExponentialLR,
который уменьшает скорость обучения экспоненциально -
класс
CosineAnnealingLR,
который изменяет скорость обучения по косинусоидальному закону -
класс
ChainedScheduler,
который последовательно применяет несколько планировщиков одновременно