Выбор ответа Junior PyTorch на практике спрашивают часто обновлено

model.eval() против torch.no_grad()

Вопрос

Чем model.eval() отличается от torch.no_grad()?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: eval() меняет поведение слоёв (dropout, BatchNorm); nograd() отключает граф. На валидации нужны оба. Это независимые механизмы.

Варианты ответа

  1. Это одно и то же: оба выключают dropout и не строят граф вычислений
  2. eval() меняет поведение слоёв (dropout, BatchNorm); no_grad() отключает граф. На валидации нужны обаправильный ответ
  3. eval() отключает градиенты и построение графа, а no_grad() выключает dropout и замораживает статистики BatchNorm
  4. no_grad() нужен только на обучении, чтобы не накапливать лишние градиенты между шагами

Разбор

Это независимые механизмы. Без eval() результаты валидации шумные из-за dropout и зависят от батча из-за BatchNorm. Без no_grad() считается граф, расходуется память и время. torch.inference_mode() ещё строже и быстрее для чистого инференса.

  • Они делают разное.
  • Роли перепутаны.
  • no_grad как раз для инференса и валидации.

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

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