Aller au contenu

3. Data augmentation

Vous repartez de votre notebook de la partie 2, en ajoutant des cellules à la suite.

Gagnez du temps

Les expériences de cette partie demandent plusieurs entraînements : faites-les sur 15 époques (une dizaine de minutes chacune sur Colab).

3.1 Voir l'augmentation

Avant de mesurer l'effet d'une augmentation, regardez ce qu'elle fait aux images.

  1. Créez un jeu d'entraînement avec la transformation de la partie 2, sans Normalize (sinon les couleurs sont illisibles), et un DataLoader de 8 images non mélangées (shuffle=False).
  2. Affichez ce batch sous forme de grille, et sauvegardez la figure dans train_DA.png.
  3. Réexécutez la cellule plusieurs fois. Les images sont-elles toujours les mêmes ? Pourquoi ?
Indice

torchvision.utils.make_grid(images, nrow=4) assemble un batch en une seule image de forme (3, H, W). Pour l'afficher avec plt.imshow, les canaux doivent être en dernier : .permute(1, 2, 0).

Essayez ensuite d'autres transformations : v2.ColorJitter(0.4, 0.4, 0.4), v2.RandomRotation(15), v2.RandomErasing() (à placer après v2.ToDtype), v2.TrivialAugmentWide(). Lesquelles gardent une image reconnaissable ?

3.2 Avec ou sans augmentation ?

Entraînez deux ResNet18 pendant 15 époques :

  • l'un sans data augmentation (la transformation d'entraînement est la même que celle de validation) ;
  • l'autre avec la data augmentation de la partie 2.

Tracez les quatre courbes de précision (train et val, avec et sans) sur un même graphique.

Q1. Sans augmentation, que devient la précision d'entraînement ? Et celle de validation ? Où voit-on le surapprentissage ?

Q2. L'augmentation rend-elle l'entraînement plus facile ou plus difficile ? Pourquoi est-ce une bonne chose ?

Résultat attendu

Mesuré avec les réglages du TP, sur 15 époques :

train val écart
sans augmentation 100 % 86 % 14 points
avec augmentation 95 % 91 % 4 points

Sans augmentation, le réseau apprend par cœur les images d'entraînement (100 % dès la 13ᵉ époque, perte quasi nulle) sans progresser autant en validation : c'est le surapprentissage, visible dans l'écart entre les deux courbes. Ne cherchez pas une perte de validation qui remonte nettement : le scheduler, en faisant baisser le taux d'apprentissage, la masque en grande partie.

3.3 Votre propre augmentation

Ajoutez une ou deux transformations de votre choix à la transformation d'entraînement, et comparez à 15 époques.

Q3. Votre augmentation améliore-t-elle la précision de validation ? Si non, proposez une explication. Pensez à la durée d'entraînement : une augmentation plus forte demande souvent plus d'époques pour porter ses fruits.

3.4 Bonus : mixup

Mixup ne transforme pas une image seule : il mélange deux images et leurs étiquettes. Pour chaque batch \((X, y)\) :

  1. tirer une permutation aléatoire du batch : perm = torch.randperm(X.size(0)) ;
  2. tirer \(\lambda\) uniformément dans \([0, 1]\) ;
  3. former le batch mélangé \(X_m = \lambda X + (1 - \lambda) X_{perm}\) ;
  4. calculer la sortie \(\hat{y} = \text{model}(X_m)\) ;
  5. calculer la perte \(\lambda \, \text{CE}(\hat{y}, y) + (1 - \lambda) \, \text{CE}(\hat{y}, y_{perm})\) ;
  6. rétropropager et faire le pas d'optimisation, comme d'habitude.

Écrivez une fonction train_one_epoch_mixup, sur le modèle de train_one_epoch, et comparez avec votre baseline.

Q4. Que signifie la « précision d'entraînement » quand les images sont mélangées ? Comment la mesureriez-vous ?

Pour aller plus loin

L'article original : mixup, Zhang et al. 2017. Une variante qui découpe et colle au lieu de mélanger : CutMix, Yun et al. 2019.


Votre baseline et vos courbes seront le point de départ des séances de compression. Gardez baseline_resnet18.pt et notez sa précision.