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 5 · Apprendre

Le réseau des organes

Place au réseau de la partie 4 du cours : 784 → 128 → 64 → 11, entraîné sur les coupes de scanner d'OrganAMNIST : 34 561 images d'entraînement, soit 541 paquets par époque (paquets de 64). Il y a 11 organes à reconnaître : le réseau renvoie 11 scores, un par organe. Tu feras d'abord deux vérifications avant d'entraîner, puis tu suivras les courbes, puis tu compareras zéro, une et deux couches cachées.

Le réseau : nn.Flatten(), nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 11). Pas de softmax à la fin : nn.CrossEntropyLoss reçoit les scores bruts et l'applique elle-même (donner des probabilités serait l'erreur de la « double softmax »). Pourquoi une fonction creer_reseau() ? Pour fabriquer un réseau neuf, aux poids tirés au hasard, à chaque appel.

La softmax transforme 11 scores en 11 probabilités de somme 1 ; la perte vaut −log de la probabilité de la bonne réponse. Mets tous les scores à 0 : la perte vaut −log(1/11) ≈ 2,40, celle d'un réseau qui n'a rien appris. Seul le nom « foie » (case 0) vient du cours ; les autres organes sont simplement numérotés (le cours ne les nomme pas).

Compter les paramètres

Une couche nn.Linear(entrées, sorties) a entrées × sorties poids et sorties biais. Pour le réseau complet : 784 × 128 + 128 = 100 480, puis 128 × 64 + 64 = 8 256, puis 64 × 11 + 11 = 715. Total : 109 451 paramètres. Le réseau sans couche cachée (784 → 11) en a 8 635 ; avec une seule couche cachée de 128 neurones, 101 899.

À toi de coder

Compter les paramètres des réseaux

Pourquoi : savoir combien de paramètres coûte chaque couche cachée, avant de décider si le gain vaut le coût. Complète la fonction linear(entrees, sorties) (poids plus biais), puis c1, c2, c3 pour les trois couches du réseau 784 → 128 → 64 → 11, et total. Calcule aussi sans_couche (784 → 11) et une_couche (784 → 128 → 11).

Ctrl/⌘+Entrée

Deux vérifications avant d'entraîner (partie 9)

1. La perte au départ. Un réseau neuf donne à peu près le même score à chaque organe : sa perte doit valoir environ −log(1/11) ≈ 2,40. Sur le premier paquet, le notebook obtient 2,37 (le contrôle accepte ±0,25). Une valeur très différente signale un mauvais format d'étiquettes ou une softmax en trop.

2. Un seul paquet, appris par cœur. Avec un réseau neuf, 100 pas d'apprentissage sur le même paquet de 64 images : avec 109 451 paramètres, le réseau doit le retenir, et la perte tomber près de 0. Le notebook passe de 2,366 à 0,0013. Si ce n'est pas le cas, la boucle a un problème (étapes 3, 4 ou 5).

Autre piège de format : MedMNIST range les numéros d'organes en colonne, de forme (64, 1), alors que CrossEntropyLoss les attend en liste d'entiers : d'où etiquettes.squeeze(1).long().

À toi de coder

Softmax et perte de départ

Pourquoi : retrouver à la main les deux chiffres de la partie 4 : les probabilités de scores foie / rate / rein, et la perte d'un réseau qui n'a rien appris. Complète softmax(scores) (chaque escore divisé par leur somme). probas est la softmax de [2,0 ; 1,0 ; 0,1] ; perte_foie vaut −log de la probabilité du foie, en case 0 ; depart est la perte de 11 scores nuls quand la bonne réponse est la case 10.

Ctrl/⌘+Entrée

Entraîner et suivre les courbes

La fonction evaluer est celle de l'exercice 4, adaptée aux 11 organes : le réseau choisit l'organe au plus grand score, avec argmax(dim=1). Après 5 époques d'entraînement, le notebook affiche :

ÉpoquePerte entraînementPerte validationAccuracy validation
10,6270,38890,1 %
20,2460,40690,3 %
30,1320,45990,0 %
40,0820,46790,5 %
50,0560,54789,2 %

Compare avec la note à battre : répondre toujours l'organe le plus fréquent donne 15,9 %. Le réseau fait donc bien mieux (89,2 %). Mais lis les courbes : la perte d'entraînement baisse sans cesse, alors que celle de validation remonte dès l'époque 2. Les deux pertes ne baissent pas ensemble : c'est le signe du sur-apprentissage, objet de la partie suivante.

Zéro, une ou deux couches cachées ?

L'exercice 5.2 du notebook demande d'entraîner « trois réseaux » 3 époques chacun. Mais le code rendu appelle trois fois entrainer_et_noter(creer_reseau(), 3), et creer_reseau() renvoie toujours le même réseau 784 → 128 → 64 → 11 (109 451 paramètres). Les trois accuracy de validation (90,7 %, 89,7 %, 90,0 %) sont donc trois entraînements du même réseau : elles montrent seulement l'écart dû au hasard, environ 1 point, et ne comparent aucune architecture.

Pour comparer 0, 1 et 2 couches cachées, il faudrait passer sans_couche (784 → 11, 8 635 paramètres), une_couche (784 → 128 → 11, 101 899 paramètres), puis creer_reseau() (109 451 paramètres). Le notebook ne donne aucun résultat chiffré pour cette comparaison ; ce que tu peux retenir, ce sont les nombres de paramètres : 11,8 fois plus pour une couche, 12,7 fois plus pour deux. Et qu'on juge un modèle sur la validation, pas sur le nombre de paramètres.

Les nombres de paramètres des trois réseaux de l'exercice 5 (chiffres du notebook). Attention : les accuracy du notebook (90,7 / 89,7 / 90,0 %) viennent de trois entraînements du même réseau, elles ne sont donc pas affichées ici.

À toi de coder

Combien de paramètres de plus ?

Pourquoi : chiffrer ce que coûtent les couches cachées, avant de se demander si elles valent le coup. Le dictionnaire params associe chaque réseau à son nombre de paramètres (chiffres du notebook). Complète surcout (paramètres de « 2 couches » moins ceux de « 0 couche ») et facteur (combien de fois « 2 couches » a plus de paramètres que « 0 couche », arrondi à 1 décimale).

Ctrl/⌘+Entrée

Pour aller plus loin (notebook) : remplace Adam par torch.optim.SGD(modele.parameters(), lr=0.1) dans entrainer_et_noter, puis essaie lr=0.01 et lr=1. Quel pas marche le mieux ? (Lien avec la partie 3 : un pas trop petit avance lentement, un pas trop grand fait remonter la perte.) Le notebook ne donne pas de résultat chiffré.