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.
- Créez un jeu d'entraînement avec la transformation de la partie 2, sans
Normalize(sinon les couleurs sont illisibles), et unDataLoaderde 8 images non mélangées (shuffle=False). - Affichez ce batch sous forme de grille, et sauvegardez la figure dans
train_DA.png. - 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)\) :
- tirer une permutation aléatoire du batch :
perm = torch.randperm(X.size(0)); - tirer \(\lambda\) uniformément dans \([0, 1]\) ;
- former le batch mélangé \(X_m = \lambda X + (1 - \lambda) X_{perm}\) ;
- calculer la sortie \(\hat{y} = \text{model}(X_m)\) ;
- calculer la perte \(\lambda \, \text{CE}(\hat{y}, y) + (1 - \lambda) \, \text{CE}(\hat{y}, y_{perm})\) ;
- 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.