Выбор ответа Junior PyTorch на практике спрашивают часто обновлено
model.eval() против torch.no_grad()
Вопрос
Чем model.eval() отличается от torch.no_grad()?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: eval() меняет поведение слоёв (dropout, BatchNorm); nograd() отключает граф. На валидации нужны оба. Это независимые механизмы.
Варианты ответа
- Это одно и то же: оба выключают dropout и не строят граф вычислений
- eval() меняет поведение слоёв (dropout, BatchNorm); no_grad() отключает граф. На валидации нужны обаправильный ответ
- eval() отключает градиенты и построение графа, а no_grad() выключает dropout и замораживает статистики BatchNorm
- no_grad() нужен только на обучении, чтобы не накапливать лишние градиенты между шагами
Разбор
Это независимые механизмы. Без eval() результаты валидации шумные из-за dropout и зависят от батча из-за BatchNorm. Без no_grad() считается граф, расходуется память и время. torch.inference_mode() ещё строже и быстрее для чистого инференса.
- Они делают разное.
- Роли перепутаны.
- no_grad как раз для инференса и валидации.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.