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 2 · Voir

Construire un CNN

Dans un CNN, qu'est-ce qu'un neurone ? Pas un élément du filtre : c'est le calcul fait à une position de la fenêtre ; sa sortie est une case de la carte. Même calcul qu'en J1 (somme pondérée + biais, ReLU), mais deux choses changent.

MLP (J1)CNN
Un neurone littous les pixels (784)une fenêtre : 9 pixels
Ses poidsà lui seulle filtre, partagé par tous les neurones de la carte
Sa sortieun nombreune case de la carte

Conséquence chiffrée : la couche 1 du CNN des organes a 16 cartes de 28 × 28, soit 12 544 neurones, mais seulement 16 × 10 = 160 paramètres. La couche 1 du MLP de J1 avait 128 neurones et 100 480 paramètres.

Un filtre par motif. Notre filtre ne voit que les bords verticaux. Un deuxième filtre (−1 en haut, +1 en bas) calcule bas − haut et répond au bord du haut. Une couche de convolution contient plusieurs filtres appliqués à la même entrée ; on empile leurs cartes, ce sont les canaux de la sortie (ici 2). Personne ne choisit les filtres dans un vrai CNN : leurs 9 poids et leur biais sont tirés au hasard, puis réglés par la descente de gradient, comme en J1.

Trois mots, trois choses :

  • Filtre : un jeu de poids et un biais qui glisse sur l'entrée ; il produit une carte.
  • Canal : une grille de nombres, une carte. Un carré de pixels : forme 1 × 6 × 6 (canaux × hauteur × largeur) ; après nos 2 filtres : 2 × 4 × 4 ; une photo couleur : 3 × 224 × 224.
  • Couche : plusieurs filtres sur la même entrée ; k filtres donnent k canaux.

Et ils se combinent : un filtre de la couche suivante lit sa fenêtre au même endroit sur tous les canaux et en sort une seule carte. Sur nos 2 canaux : 3 × 3 × 2 = 18 poids + 1 biais ; sur 16 canaux : 3 × 3 × 16 = 144 poids + 1 biais ; sur une photo couleur : 27 poids + 1 biais.

paramètres d'une couche = filtres × (k × k × canaux d'entrée + 1)

À toi de coder

Compter les paramètres du CNN des organes

Le CNN des organes a deux convolutions (16 filtres 3 × 3 sur 1 canal, puis 32 filtres 3 × 3 sur 16 canaux) et une couche dense de 1 568 entrées vers 11 scores. Les ReLU, les poolings et le Flatten n'ont aucun paramètre : on ne compte que les trois couches. Écris params_conv(filtres, k, canaux) et params_dense(entrees, sorties) avec les formules du cours (n'oublie pas un biais par filtre et un par sortie), puis additionne dans total. Le cours annonce 22 059, environ 5 fois moins que les 109 451 du MLP de J1.

Dernière étape, pour comprendre le rôle du pooling : total_sans_pooling, le même réseau sans ses deux poolings. Les cartes restent en 28 × 28, donc la couche dense lit 32 × 28 × 28 nombres.

Ctrl/⌘+Entrée

Un coin, c'est un bord vertical et un bord horizontal au même endroit. La couche 2 peut donc combiner les deux canaux de la couche 1 : un neurone qui additionne les deux cartes (poids 1 et 1), ajoute un biais de −3 et applique la ReLU ne garde que la case où la somme atteint 4, là où les deux bords sont présents. Première couche : des bords ; deuxième : des coins ; les suivantes : des formes plus grandes.

Le max pooling découpe la carte en zones de 2 × 2 cases et ne garde que le maximum de chacune. Trois bénéfices : (1) les petits décalages ne comptent plus (l'organe décalé d'un pixel donne le même résumé) ; (2) 4 fois moins de cases, donc moins de calculs ; (3) chaque case couvre 2 × 2 cases, le filtre 3 × 3 suivant voit une zone plus grande. Limite : seulement pour les petits décalages, et on perd la position exacte dans la zone (voulu).

La carte du coin (un seul 1) découpée en zones de 2 × 2. Décale-la d'une colonne : le résumé reste identique tant que le 1 reste dans sa zone, et change dès qu'il en sort.

À toi de coder

Le max pooling 2 × 2

Le pooling est la pièce qui manquait pour que la réponse ne dépende presque plus de la position. Complète maxpool2(carte) : la carte est une liste de listes de taille paire ; chaque zone de 2 × 2 cases est remplacée par son maximum. La zone de la ligne de sortie a et de la colonne b commence à la case (2a, 2b). Tu l'appliques à la carte du coin (carte_coin) et à la même carte pour l'organe décalé d'un pixel (carte_decalee), et tu dois voir que le résumé est identique.

Ctrl/⌘+Entrée

On enchaîne des étages « convolution, ReLU, pooling », puis la couche dense de J1 décide. Le CNN des 11 organes, forme = canaux × hauteur × largeur :

ÉtapeForme de la sortie
Entrée : une coupe1 × 28 × 28
Convolution : 16 filtres 3 × 3, padding 1, ReLU16 × 28 × 28
Max pooling 2 × 216 × 14 × 14
Convolution : 32 filtres 3 × 3, padding 1, ReLU32 × 14 × 14
Max pooling 2 × 232 × 7 × 7
Flatten32 × 7 × 7 = 1 568
Linear11 scores

Pourquoi une couche dense à la fin ? Les 1 568 nombres disent chacun si un des 32 motifs est présent dans l'une des 7 × 7 zones. Chaque score d'organe doit les combiner tous : un neurone de J1 relié aux 1 568 nombres, nn.Linear(1568, 11). Pas de softmax à la fin : CrossEntropyLoss l'applique.

cnn = nn.Sequential(
    nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Flatten(), nn.Linear(32 * 7 * 7, 11))

Les paquets ont la forme (64, 1, 28, 28), sans Flatten au début : le CNN lit l'image en 2D. La boucle d'entraînement, la perte et Adam (pas 0,001, paquets de 64, 10 époques) sont ceux de J1. À toi de compter les paramètres avec la démo : 22 059 contre 109 451.

Par défaut (16 et 32 filtres, avec pooling) tu retrouves 22 059 contre 109 451, soit 5,0 fois moins, dont environ 78 % dans la couche dense. Décoche le pooling : la couche dense explose. Les filtres sont appris, pas choisis.

À toi de coder

Suivre la forme d'une coupe dans le CNN

Le piège classique : se tromper sur le nombre d'entrées de nn.Linear. Il faut donc suivre la forme de la coupe, étage par étage. Ici, une carte est décrite par (canaux, taille) (hauteur = largeur). Complète conv(forme, filtres, k, p, s), qui renvoie la nouvelle forme (le nombre de canaux devient le nombre de filtres ; la taille suit la formule de la partie 1), et pool(forme), qui divise la taille par 2. Enchaîne les quatre étapes sur la coupe (1, 28) et calcule entrees_dense (canaux × taille × taille), qui doit valoir 1 568.

Ctrl/⌘+Entrée