Оценка моделей pytorch: `с torch.no_grad` против` model.eval () ` - PullRequest
6 голосов
/ 11 апреля 2019

Когда я хочу оценить производительность моей модели на проверочном наборе, предпочтительнее использовать:

  • with torch.no_grad:

Или

  • model.eval()

1 Ответ

7 голосов
/ 11 апреля 2019

TL; DR:

Используйте оба . Они делают разные вещи и имеют разные возможности.

  • with torch.no_grad - отключает отслеживание градиентов в autograd.
  • model.eval() изменяет поведение forward() модуля, для которого он вызывается
    • например, он отключает отсев и имеет пакетную норму использования всей статистики населения

with torch.no_grad

Документация torch.autograd.no_grad гласит:

Context-менеджер, который отключил [sic] расчет градиента.

Отключение вычисления градиента полезно для вывода, когда вы уверены, что не будете звонить Tensor.backward(). Это уменьшит потребление памяти для вычислений, которые в противном случае имели бы requires_grad=True. В этом режиме результат каждого вычисления будет иметь requires_grad=False, даже если входные данные имеют requires_grad=True.

model.eval()

Документация nn.Module.eval гласит:

Устанавливает модуль в режим оценки.

Это влияет только на определенные модули. Для получения подробной информации об их поведении в режиме обучения / оценки смотрите документацию конкретных модулей, например, Dropout, BatchNorm и т. Д.


Создатель pytorch сказал, что документация должна быть обновлена, чтобы предложить использование обоих .

...