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