web-dev-qa-db-fra.com

Évaluation des modèles Pytorch: `avec torch.no_grad` vs` model.eval () `

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()
22
Tom Hale

TL; DR:

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é
    • par exemple, il désactive le décrochage et a la norme de lot utiliser les statistiques de population entière

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 autrement requires_grad=True. Dans ce mode, le résultat de chaque calcul aura requires_grad=False, Même lorsque les entrées auront requires_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.


Le créateur de pytorch a déclaré que la documentation devrait être mise à jour pour suggérer l'utilisation des deux .

24
Tom Hale