Класс MultiStepLR
Класс MultiStepLR реализует многошаговое изменение скорости обучения. Первым параметром конструктор принимает оптимизатор, вторым параметром - список эпох, на которых происходит уменьшение скорости. Третьим параметром задаётся коэффициент умножения. Обычно используется для уменьшения скорости обучения на фиксированных этапах обучения.
Синтаксис
torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1)
Пример
Давайте создадим оптимизатор и планировщик, который будет уменьшать скорость обучения на 3-й и 6-й эпохах:
import torch
from torch import nn
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.MultiStepLR(
optimizer,
milestones=[3, 6],
gamma=0.1,
)
for epoch in range(8):
scheduler.step()
print(f'Epoch {epoch}: {scheduler.get_last_lr()[0]}')
Результат выполнения кода:
Epoch 0: 0.1
Epoch 1: 0.1
Epoch 2: 0.1
Epoch 3: 0.01
Epoch 4: 0.01
Epoch 5: 0.01
Epoch 6: 0.001
Epoch 7: 0.001
Пример
Давайте создадим планировщик с коэффициентом уменьшения 0.5 на эпохах 2, 4 и 8:
import torch
from torch import nn
model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
scheduler = torch.optim.lr_scheduler.MultiStepLR(
optimizer,
milestones=[2, 4, 8],
gamma=0.5,
)
for epoch in range(10):
scheduler.step()
print(f'Epoch {epoch}: {scheduler.get_last_lr()[0]}')
Результат выполнения кода:
Epoch 0: 0.01
Epoch 1: 0.01
Epoch 2: 0.005
Epoch 3: 0.005
Epoch 4: 0.0025
Epoch 5: 0.0025
Epoch 6: 0.0025
Epoch 7: 0.0025
Epoch 8: 0.00125
Epoch 9: 0.00125
Пример
Давайте создадим планировщик, который уменьшает скорость обучения только для определённых параметров:
import torch
from torch import nn
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 1),
)
optimizer = torch.optim.SGD([
{'params': model[0].parameters(), 'lr': 0.1},
{'params': model[2].parameters(), 'lr': 0.01},
])
scheduler = torch.optim.lr_scheduler.MultiStepLR(
optimizer,
milestones=[5, 10],
gamma=0.5,
)
for epoch in range(12):
scheduler.step()
lrs = scheduler.get_last_lr()
print(f'Epoch {epoch}: {lrs}')
Результат выполнения кода:
Epoch 0: [0.1, 0.01]
Epoch 1: [0.1, 0.01]
Epoch 2: [0.1, 0.01]
Epoch 3: [0.1, 0.01]
Epoch 4: [0.1, 0.01]
Epoch 5: [0.05, 0.005]
Epoch 6: [0.05, 0.005]
Epoch 7: [0.05, 0.005]
Epoch 8: [0.05, 0.005]
Epoch 9: [0.05, 0.005]
Epoch 10: [0.025, 0.0025]
Epoch 11: [0.025, 0.0025]
Смотрите также
-
класс
StepLR,
который уменьшает скорость обучения с фиксированным интервалом -
класс
ExponentialLR,
который уменьшает скорость обучения экспоненциально на каждой эпохе -
класс
CosineAnnealingLR,
который изменяет скорость обучения по косинусоиде -
класс
ReduceLROnPlateau,
который уменьшает скорость обучения при застревании метрики