Код-ревью Middle PyTorch на практике спрашивают часто обновлено

Ревью: цикл обучения

Вопрос

Найдите ошибки в цикле обучения и валидации классификатора.

train_loader = DataLoader(train_ds, batch_size=32, shuffle=False)
val_loader = DataLoader(val_ds, batch_size=32)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)
model = model.cuda()
history = []
for epoch in range(10):
    for x, y in train_loader:
        logits = model(x.cuda())
        loss = criterion(torch.softmax(logits, dim=1), y.cuda())
        loss.backward()
        optimizer.step()
        history.append(loss)
    val_loss = sum(criterion(model(x.cuda()), y.cuda()) for x, y in val_loader)

Коротко

Правильный каркас: перемешанный трейн, zerograd перед backward, логиты в CrossEntropyLoss, loss.item() для логов, валидация в eval() и nograd() со средним по объектам, затем возврат в train(). Каждая из этих ошибок встречается в реальных проектах и даёт тихо испорченную модель.

Что должен найти ревьюер

  1. Ошибкастрока 1
    shuffle=False на трейне: если данные отсортированы, батчи однородны и обучение нестабильно.
  2. Стильстрока 4
    Модель переносится на GPU после создания оптимизатора; для model.cuda() это обычно работает, но правильный порядок: сначала .to(device), потом оптимизатор.
  3. Ошибкастрока 9
    В CrossEntropyLoss подан softmax: он применится второй раз, нужно подавать логиты.
  4. Ошибкастрока 10
    Нет optimizer.zero_grad(): градиенты копятся между шагами.
  5. Ошибкастрока 12
    history хранит тензоры loss с графом: утечка памяти, нужен loss.item().
  6. Ошибкастрока 13
    Валидация без model.eval() и torch.no_grad(): dropout и BatchNorm в режиме обучения, строится граф; плюс loss суммируется по батчам без деления на число объектов, и после неё нет model.train().

Разбор

Правильный каркас: перемешанный трейн, zero_grad перед backward, логиты в CrossEntropyLoss, loss.item() для логов, валидация в eval() и no_grad() со средним по объектам, затем возврат в train(). Каждая из этих ошибок встречается в реальных проектах и даёт тихо испорченную модель.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.