Aller au contenu
Apprendre.
  • M1 · toutes les matières15 matières : Préparation de données, API & sécurité, CI/CD, Docker, Merise, Dataviz, KNIME, ML appliqué : projet LoL, SQL & UML, SQL avancé, Machine Learning, Git, IA frugale & responsable, Qualité des données, MathématiquesAnnée
  • M2 · toutes les matières4 matières : Deep Learning, AI Act, Comex & Fundraising, Gouvernance & DataMeshAnnée
  • Deep LearningM2 · 4 modules · Réseaux de neurones, CNN, texte, modèles génératifs.Matière
  • Préparation de donnéesM1 · 3 modules · Nettoyer, transformer et fusionner des données avec Python.Matière
  • API & sécuritéM1 · 2 modules · Consommer, concevoir et sécuriser des API.Matière
  • CI/CDM1 · 1 module · Intégration et livraison continues.Matière
  • DockerM1 · 3 modules · Conteneurs, images, volumes, réseaux, Compose.Matière
  • MeriseM1 · 2 modules · Modéliser une base : MCD, MLD, MPD.Matière
  • DatavizM1 · 2 modules · Visualiser pour comprendre et décider.Matière
  • KNIMEM1 · 1 module · Explorer et nettoyer des données en workflow.Matière
  • ML appliqué : projet LoLM1 · 2 modules · Du besoin métier au POC de vision par ordinateur.Matière
  • SQL & UMLM1 · 3 modules · Modèles UML et requêtes SQL.Matière
  • SQL avancéM1 · 3 modules · Jointures, fenêtres, CTE, optimisation.Matière
  • Machine LearningM1 · 3 modules · Régression, classification, segmentation, projet.Matière

↑↓ naviguer↵ ouvre le résultat en surbrillanceesc fermer

Partie 6 · Apprendre

Le sur-apprentissage

Avec seulement 1 000 images d'entraînement, le réseau des organes finit par les apprendre par cœur : il connaît ses images, mais plus les nouvelles. Dans l'exercice 6, tu vas le voir sur les courbes, appliquer le remède du cours (garder les poids de la meilleure époque de validation), puis mesurer la note de test, une seule fois.

Le petit jeu : Subset(train_set, range(1000)) garde les 1 000 premières images d'un jeu ; un DataLoader par paquets de 64, mélangés, donne 16 paquets par époque (1 000 / 64 = 15,6 arrondi vers le haut). On entraîne 60 époques et on note, à chaque époque, la perte d'entraînement et la perte de validation (sur le jeu de validation, via val_loader).

À toi de coder

Un petit jeu d'entraînement

Pourquoi : provoquer le sur-apprentissage demande un jeu d'entraînement minuscule. Voici images, une liste de 34 561 noms (maquette ajoutée de train_set). Complète indices (les indices des 1 000 premières images), nb_paquets (paquets de 64) et petit_train (les images de ces indices), comme le fait Subset.

Ctrl/⌘+Entrée
Schéma ajouté (les courbes sont calculées par une formule, pas mesurées) : fais avancer les époques puis change la capacité du réseau. L'entraînement baisse toujours ; la validation passe par un minimum (trait vert) puis remonte. Un réseau plus gros atteint ce minimum plus tôt.

Lire les courbes

(Lecture usuelle, reprise du tableau de la partie 9 du polycopié, non fourni.)

Ce que tu voisCe que ça veut dire
Entraînement et validation baissent ensemblele réseau apprend : continue
Entraînement baisse, validation remontele réseau apprend par cœur : sur-apprentissage
Les deux restent hautesle réseau n'apprend pas assez (boucle, pas, capacité)

Le contrôle du notebook (verifier_sur_apprentissage) utilise la règle suivante : la perte d'entraînement finale tombe sous 0,1, la perte de validation finale dépasse 1,1 fois son minimum, et ce minimum n'est pas à la dernière époque. Tu l'as déjà observée en petit à l'exercice 5 : l'entraînement passe de 0,627 à 0,056 (sous 0,1), alors que la validation passe de 0,388 à 0,547, plus de 1,1 fois son minimum 0,388 (atteint à l'époque 1).

À toi de coder

Diagnostiquer le sur-apprentissage

Pourquoi : transformer « je regarde la courbe » en test automatique. Les listes pertes_entrainement et pertes_validation sont celles de l'exercice 5 (5 époques). Complète meilleure (la plus petite perte de validation), meilleure_epoque (son numéro, en comptant à partir de 1) et surapprentissage : vrai si la perte d'entraînement finale est sous 0,1 et la perte de validation finale dépasse 1,1 fois meilleure.

Ctrl/⌘+Entrée

Garder les poids de la meilleure époque

modele.state_dict() renvoie tous les poids du modèle, mais ce sont les poids vivants : ils continuent de changer à chaque pas. Pour en garder une photo figée, on les copie avec copy.deepcopy(...). Plus tard, modele.load_state_dict(poids) remet ces poids dans le modèle.

La boucle : à chaque époque, si la perte de validation est la plus basse vue jusqu'ici, on note le numéro de l'époque (epoque + 1) et on garde une copie figée des poids. On part de meilleure_perte = float("inf") (l'infini : la première perte fera forcément mieux). À la fin, on remet les meilleurs poids dans le modèle.

Les cinq pertes de validation de l'exercice 5 (0,388 ; 0,406 ; 0,459 ; 0,467 ; 0,547) servent de piste. Maquette ajoutée : le poids w vaut le numéro de l'époque. Décoche deepcopy : la « photo » suit le modèle et finit sur la dernière époque, pas sur la meilleure.

À toi de coder

La photo des meilleurs poids

Pourquoi : reproduire sans PyTorch le piège de state_dict. La maquette poids = {"w": 0} grandit de 1 à chaque époque (ses poids « vivants »). Pour chaque perte de pertes_validation, si elle est plus basse que meilleure_perte, mets à jour meilleure_perte, meilleure_epoque (numéro à partir de 1) et meilleurs_poids (une copie figée de poids). À la fin, remets les meilleurs poids dans poids avec poids.update(...).

Ctrl/⌘+Entrée

La note finale, une seule fois

Les images de test n'ont servi à rien jusqu'ici : ni à apprendre, ni à choisir l'époque. On mesure l'accuracy de test, avec les meilleurs poids, une seule fois, à la toute fin (un DataLoader sur test_set, par paquets de 256, et evaluer(modele, test_loader)). Le jeu de test d'OrganAMNIST compte 17 778 images.

Pourquoi une seule fois ? Réponse b du notebook : parce qu'on a choisi la meilleure époque grâce à la validation, sa note est donc un peu trop optimiste ; le test, jamais utilisé avant, donne une note honnête. Ce n'est pas une question de temps de calcul (réponse a), ni d'organes différents (réponse c : les trois groupes contiennent les mêmes 11 organes, mais des scanners différents).

Pour aller plus loin (notebook) : entraîne le même réseau sur les 34 561 images pendant 5 époques. Quelle accuracy de test obtiens-tu ? Qu'en conclus-tu sur le meilleur remède au sur-apprentissage ? Le notebook laisse la conclusion ouverte (piste, non vérifiée ici : plus d'images d'entraînement).