Objectif : lire les dimensions d'un tenseur et prévenir la majorité des erreurs de forme. Prérequis : NumPy élémentaire.
Un tenseur est un tableau multidimensionnel homogène. Un scalaire a zéro axe, un vecteur un axe, une matrice deux axes. Le rang n'est pas le nombre d'éléments : c'est le nombre d'axes.
| Donnée | Forme habituelle |
|---|---|
| Tableau dense | (batch, features) |
| Images PyTorch | (batch, channels, height, width) |
| Texte tokenisé | (batch, sequence_length) |
| Logits multiclasse | (batch, classes) |
import torch
x = torch.randn(32, 3, 224, 224)
print(x.shape, x.dtype, x.device)
assert x.ndim == 4Le batch regroupe plusieurs exemples traités en parallèle. Un mini-batch de 32 images produit une estimation du gradient moins exacte que le jeu complet, mais beaucoup moins coûteuse. Cette petite quantité de bruit peut même aider la généralisation.
Les poids sont généralement en float32. Les étiquettes attendues par
CrossEntropyLoss sont des entiers torch.long. Toutes les données d'une opération
doivent se trouver sur le même appareil : CPU, CUDA ou autre accélérateur.
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = x.to(device=device, dtype=torch.float32)À chaque couche, écrivez la forme attendue avant le code. Pour une couche dense
Linear(128, 10), le dernier axe entrant doit mesurer 128. Utilisez reshape avec prudence
et préférez flatten(start_dim=1) pour préserver l'axe du batch.
NHWC et NCHW.squeeze().float32 à une perte qui attend des indices de classe.Quelle est la forme de 64 images RGB 32×32 dans PyTorch ? Quel axe une couche dense interprète-t-elle comme dimension d'entrée ?
(64, 3, 32, 32). La couche dense utilise le dernier axe.
Partez de X.shape = (32, 3, 64, 64). Faites traverser une convolution produisant 16
canaux, une réduction spatiale par deux, un pooling global et une tête à 7 classes. Écrivez
chaque forme et trois assertions Python. Réussite : l'axe du lot reste 32 et la sortie vaut
(32, 7).
Lecture : l'axe B traverse tout le réseau ; seules les dimensions de représentation sont
transformées. Avant l'entraînement, vérifiez explicitement X.ndim, l'ordre des canaux et
la concordance entre logits.shape[0] et y.shape[0]. Le piège principal est une
permutation silencieuse des axes : le code peut s'exécuter tout en apprenant une structure
qui n'a aucun sens.