Objectif : suivre le calcul d'un réseau et distinguer entraînement et inférence.
La propagation avant (forward pass) applique chaque couche dans l'ordre. Elle produit les logits, puis la perte si les cibles sont disponibles. Elle ne modifie aucun poids.
logits = model(x) # propagation avant
loss = criterion(logits, y)Pour un batch x de forme (32, 20), une couche Linear(20, 64) donne (32, 64).
Une seconde Linear(64, 4) donne (32, 4). L'axe batch est conservé ; le dernier axe
change selon la couche.
En entraînement, le réseau conserve les informations nécessaires au calcul des gradients. En inférence, on désactive ce suivi et on place le modèle en mode évaluation :
model.eval()
with torch.inference_mode():
logits = model(x)
predictions = logits.argmax(dim=1)model.eval() règle le comportement de Dropout et BatchNorm. inference_mode() évite la
construction du graphe de gradient. Les deux opérations sont complémentaires.
Un réseau est un graphe d'opérations. PyTorch mémorise quelles opérations ont produit
chaque tenseur lorsque requires_grad=True. Cette trace sera parcourue en sens inverse par
la rétropropagation.
argmax avant la fonction de perte : l'opération détruit l'information utile au
gradient.model.eval() pendant la validation.La propagation avant apprend-elle ? Pourquoi appeler à la fois eval() et
inference_mode() ?
Non, elle calcule. eval() change certaines couches ; inference_mode() désactive le
graphe de gradient.
Écrivez un pseudo-test qui appelle deux fois le même modèle contenant dropout, d'abord en
mode entraînement puis en mode évaluation. Prédisez quels résultats doivent être identiques
et expliquez le rôle distinct de eval() et inference_mode(). Livrable : test et diagnostic.
Lecture : la propagation avant calcule les sorties dans les deux cas, mais seul le parcours
d'entraînement conserve ce qui est nécessaire au calcul des gradients. En inférence,
combinez model.eval() et torch.inference_mode(). Le piège est de croire que l'un
remplace l'autre : ils contrôlent des mécanismes différents.