Как написать цикл обучения в PyTorch с валидацией и сохранением лучшей модели?
- Что такое DataLoader?
- Зачем model.eval() и torch.no_grad()?
Dataset отдаёт пример по индексу, DataLoader собирает батчи и перемешивает. Шаг обучения: optimizer.zero_grad() → прямой проход → loss → loss.backward() → optimizer.step(). Валидация — в режиме model.eval() (выключает dropout, фиксирует batchnorm) внутри torch.no_grad() (не считать градиенты). После каждой эпохи сохранять веса, если метрика на валидации улучшилась; ранняя остановка — если долго не улучшается.
- Забыть zero_grad — градиенты копятся между шагами
- Забыть model.train() после валидации — обучение без dropout
- Модель и данные — на одном устройстве (.to(device))
А ещё Сохраняют state_dict, а не весь объект модели
Подробно
Скелет:
best = float("inf")
for epoch in range(epochs):
model.train()
for x, y in train_loader:
x, y = x.to(device), y.to(device)
optimizer.zero_grad()
loss = loss_fn(model(x), y)
loss.backward()
optimizer.step()
model.eval()
with torch.no_grad():
val = sum(loss_fn(model(x.to(device)), y.to(device)).item()
for x, y in val_loader) / len(val_loader)
if val < best:
best = val
torch.save(model.state_dict(), "best.pt")
Дополнительно: планировщик learning rate, смешанная точность на GPU, логирование метрик по эпохам.
Что хотят услышать
- Dataset и DataLoader.
- Порядок шагов обучения.
- eval, no_grad при валидации.
- Сохранение лучшей модели, ранняя остановка.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓zero_grad → forward → backward → step; валидация в eval и no_grad
- ✗zero_grad вызывают один раз перед обучением
- ✗Валидацию проводят в режиме model.train(), чтобы dropout работал
- ✗Сохранять нужно веса после последней эпохи, а не лучшие
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.