Lorsque je souhaite évaluer les performances de mon modèle sur l'ensemble de validation, est-il préférable d'utiliser:
with torch.no_grad:
Ou
model.eval()
tilisez les deux . Ils font des choses différentes et ont des champs d'application différents.
with torch.no_grad
- désactive le suivi des dégradés dans autograd
.model.eval()
modifie le comportement de forward()
du module auquel il est appelé with torch.no_grad
La documentation torch.autograd.no_grad
dit:
Gestionnaire de contexte qui a désactivé le calcul du gradient [sic].
La désactivation du calcul du gradient est utile pour l'inférence, lorsque vous êtes sûr de ne pas appeler
Tensor.backward()
. Cela réduira la consommation de mémoire pour les calculs qui auraient autrementrequires_grad=True
. Dans ce mode, le résultat de chaque calcul aurarequires_grad=False
, Même lorsque les entrées aurontrequires_grad=True
.
model.eval()
La documentation nn.Module.eval
dit:
Met le module en mode d'évaluation.
Cela n'a d'effet que sur certains modules. Voir les documentations de modules particuliers pour plus de détails sur leurs comportements en mode formation/évaluation, s'ils sont affectés, par ex.
Dropout
,BatchNorm
, etc.