Как использовать Pytorch OneCycleLR в обучении l oop (и взаимодействия оптимизатора / планировщика)? - PullRequest
0 голосов
/ 31 января 2020

Я обучаю 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 они хотят, чтобы вы запускали его и для каждой мини-партии.

Любое руководство (или хорошая учебная статья) цениться!

1 Ответ

0 голосов
/ 31 января 2020

Используйте optimizer.step() перед scheduler.step(). Кроме того, для OneCycleLR вам необходимо запускать scheduler.step() после каждого шага - source (PyTorch docs) . Итак, ваш обучающий код правильный (что касается вызова step() для оптимизатора и планировщиков).

Кроме того, в приведенном вами примере они передали параметр steps_per_epoch, но вы не сделать это в вашем учебном коде. Это также упоминается в документах. Это может быть причиной проблемы в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...