Я обучаю NN и использую RMSprop в качестве оптимизатора и OneCycleLR в качестве планировщика. Я выполняю это так (в слегка упрощенном коде):
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.00001,
alpha=0.99, eps=1e-08, weight_decay=0.0001, momentum=0.0001, centered=False)
scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.0005, epochs=epochs)
for epoch in range(epochs):
model.train()
for counter, (images, targets) in enumerate(train_loader):
# clear gradients from last run
optimizer.zero_grad()
# Run forward pass through the mini-batch
outputs = model(images)
# Calculate the losses
loss = loss_fn(outputs, targets)
# Calculate the gradients
loss.backward()
# Update parameters
optimizer.step() # Optimizer before scheduler????
scheduler.step()
# Check loss on training set
test()
Обратите внимание на вызовы оптимизатора и планировщика в каждой мини-партии. Это работает, хотя, когда я строю показатели обучения в процессе обучения, кривая очень неровная. Я снова проверил документы, и это пример, показанный для torch.optim.lr_scheduler.OneCycleLR
>>> data_loader = torch.utils.data.DataLoader(...)
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(data_loader), epochs=10)
>>> for epoch in range(10):
>>> for batch in data_loader:
>>> train_batch(...)
>>> scheduler.step()
Здесь они пропускают optimizer.step()
в обучении l oop. И я подумал, что это имеет смысл, так как оптимизатор предоставляется OneCycleLR при его инициализации, поэтому он должен позаботиться об этом на серверной части. Но от этого я получаю предупреждение:
UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`.
Я игнорирую это и доверяю псевдокоду в документах? Ну, я сделал, и модель не училась, поэтому предупреждение верно, и я вставил optimizer.step()
обратно.
Это доходит до того, что я не совсем понимаю, как оптимизатор и планировщик взаимодействуют (редактировать: как скорость обучения в оптимизаторе взаимодействует с скоростью обучения в планировщике ). Я вижу, что обычно оптимизатор запускается в каждой мини-партии, а планировщик - в каждую эпоху, хотя для OneCycleLR они хотят, чтобы вы запускали его и для каждой мини-партии.
Любое руководство (или хорошая учебная статья) цениться!