2. Votre baseline ResNet18¶
Vous allez entraîner un ResNet18 sur CIFAR-10. C'est le réseau que vous compresserez pendant tout le reste du module.
Puis, tout de suite : Fichier > Enregistrer une copie dans Drive, pour travailler sur votre copie. Et passez sur GPU (Exécution > Modifier le type d'exécution > GPU T4).
- Le notebook est à trous : chaque cellule
TODOest à écrire par vous. Juste après, une cellule Vérification vous dit si votre code est juste : elle doit afficherOK. - Sa première cellule télécharge les données et
resnet.py, la description du réseau. Ouvrez ce fichier (panneau Fichiers à gauche) et lisez-le : vous y retrouverez les blocs résiduels vus en cours.
Presque tout ce que vous écrivez est dans le tutoriel de la partie 1 : chaque TODO indique la section du tutoriel où aller chercher, et donne les quelques lignes nouvelles. Gardez le tutoriel ouvert dans un autre onglet.
Jeux de données
Les 50 000 images d'entraînement de CIFAR-10 servent à l'entraînement. Les 10 000 images de test servent de validation : c'est sur elles qu'on mesure la précision du modèle.
Ci-dessous, ce que fait chaque étape et pourquoi. Le détail de ce qu'il faut écrire est dans le notebook.
1. Les données¶
Comme dans le tutoriel, avec une différence importante : deux transformations. Celle d'entraînement contient de la data augmentation (un recadrage aléatoire et une symétrie horizontale aléatoire) ; celle de validation n'en contient jamais, car on veut mesurer le modèle sur les vraies images. Vous verrez pourquoi en cours.
2. Le modèle¶
Un ResNet18, sur le GPU. Comptez ses paramètres comme à la question Q3 de la
partie 1.
Résultat attendu
11 173 962 paramètres, et une sortie de forme (128, 10) pour un batch de
128 images : un score par classe et par image.
3. Perte, optimiseur, scheduler¶
La même perte que le tutoriel, le même optimiseur avec d'autres réglages. Le weight decay est une régularisation, que vous verrez dans le cours sur la data augmentation. Le scheduler (fourni) fait décroître le taux d'apprentissage au fil des époques.
4. Une époque d'entraînement¶
La boucle d'entraînement du tutoriel, rangée dans une fonction
train_one_epoch, qui renvoie en plus la perte moyenne et la précision sur
l'époque.
5. L'évaluation¶
Le calcul de précision du tutoriel, rangé dans une fonction evaluate, qui
calcule en plus la perte. Deux lignes comptent ici : model.eval() (certaines
couches, comme la BatchNorm, ne se comportent pas pareil en entraînement et en
test) et with torch.no_grad(): (inutile de garder de quoi calculer des
gradients quand on n'apprend pas).
Résultat attendu
Sur le réseau pas encore entraîné : une perte proche de 2,3 et une précision proche de 10 %. Le réseau répond au hasard parmi 10 classes, et \(\ln(10) \approx 2{,}3\).
6. La boucle d'entraînement¶
C'est la seule partie qui n'existe pas dans le tutoriel : à chaque époque, on entraîne, on évalue, on fait avancer le scheduler, on garde l'historique, et on sauvegarde les poids chaque fois que la précision de validation s'améliore. Le squelette est dans le notebook.
Avec EPOCHS = 2, comptez de l'ordre d'une minute par époque sur Colab. Après
2 époques, on attend environ 50 à 60 % en validation.
La cellule suivante (fournie) trace les courbes de perte et de précision,
en entraînement et en validation, et les sauvegarde dans curves.png.
7. Recharger le modèle¶
On crée un nouveau ResNet18, on y charge les poids de best.pt, et on
l'évalue : on doit retrouver exactement la meilleure précision de
l'entraînement.
C'est ce que vous ferez au début de chaque TP de compression : repartir de votre baseline sans la réentraîner.
8. L'entraînement complet¶
Une fois que tout marche avec 2 époques :
- passez à
EPOCHS = 30; - relancez tout : Exécution > Tout exécuter ;
- gardez l'onglet ouvert : comptez environ 20 à 30 minutes sur le GPU de Colab.
Résultat attendu
Environ 93 % de précision en validation après 30 époques (et autour de 95 %
si l'on entraîne beaucoup plus longtemps). À la fin, best.pt et curves.png
sont dans votre dossier.
Gardez votre baseline
Les fichiers de Colab disparaissent à la fin de la session : téléchargez
best.pt (panneau Fichiers, clic droit, Télécharger), renommez-le
baseline_resnet18.pt et notez sa précision. C'est votre point de référence
pour tout le module.
Questions sur vos courbes¶
Q1. Pendant les premières époques, la précision de validation est souvent au-dessus de celle d'entraînement. Comment est-ce possible ? Proposez au moins deux raisons.
Indice
Les images d'entraînement sont-elles les mêmes que celles de validation, une fois transformées ? Et à quel moment de l'époque mesure-t-on la précision d'entraînement ?
Q2. À la fin de l'entraînement, quel est l'écart entre précision d'entraînement et de validation ? Le modèle surapprend-il ?
Q3. Le taux d'apprentissage diminue au fil des époques. Comment cela se voit-il sur vos courbes, surtout à la fin ?
Ensuite : la partie 3.