Tenseurs, formes et lots de données

2 min

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éeForme habituelle
Tableau dense(batch, features)
Images PyTorch(batch, channels, height, width)
Texte tokenisé(batch, sequence_length)
Logits multiclasse(batch, classes)
python
import torch

x = torch.randn(32, 3, 224, 224)
print(x.shape, x.dtype, x.device)
assert x.ndim == 4

Batch et mini-batch

Le 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.

Type et appareil

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.

python
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = x.to(device=device, dtype=torch.float32)

Discipline des formes

À 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.

Pièges

  • Confondre NHWC et NCHW.
  • Supprimer accidentellement l'axe batch avec squeeze().
  • Envoyer le modèle sur GPU mais laisser les données sur CPU.
  • Donner des labels float32 à une perte qui attend des indices de classe.

Vérification rapide

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 ?

Réponses

(64, 3, 32, 32). La couche dense utilise le dernier axe.

Activité de maîtrise — Audit de formes

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).

Contrat de formes d'un lot d'images

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.