Formation ML / Deep learning

CNN (réseaux convolutifs)

Intermédiaire 50 min 13 sections

Un filtre glisse sur l'image et apprend lui-même ce qu'il faut regarder, couche après couche, jusqu'aux dix classes.

Objectifs d'apprentissage

  • Comprendre les opérations de convolution et de pooling
  • Connaître l'architecture typique d'un CNN
  • Implémenter un CNN simple avec scikit-learn et visualiser les concepts
  • Interpréter les filtres et les feature maps

Prérequis

Module Réseau de neurones recommandé

Théorie

Pourquoi les CNN pour les images?

Les réseaux de neurones convolutifs (CNN) sont spécialisés pour traiter des données ayant une structure spatiale, comme les images.

Problème avec les réseaux classiques:

  • Une image 28x28 = 784 features
  • Perte de la structure spatiale (voisinage des pixels)
  • Trop de paramètres (explosion combinatoire)

Solution des CNN:

  • Convolution: Détecte des motifs locaux (bords, textures)
  • Pooling: Réduit la dimension, rend robuste aux translations
  • Hiérarchie: Motifs simples → motifs complexes

Applications:

  • Classification d'images (chats vs chiens)
  • Détection d'objets (voitures dans une photo)
  • Segmentation (délimiter les organes en imagerie médicale)
  • Reconnaissance faciale

Avantages:

  • Invariance aux translations (un chat reste un chat ou qu'il soit)
  • Partage des poids (moins de paramètres)
  • Capture la hiérarchie des features
Théorie

Schéma: Architecture d'un CNN

Les couches d'un CNN:

flowchart LR I["Image
28x28x1"] C1["Conv
+ ReLU"] P1["MaxPool"] C2["Conv
+ ReLU"] P2["MaxPool"] F["Flatten"] D["Dense"] O["Sortie
10 classes"] I --> C1 --> P1 --> C2 --> P2 --> F --> D --> O class I ml-node-secondary class O ml-node-accent

Opération de convolution:

flowchart TD subgraph Input ["Image 5x5"] I["1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1"] end subgraph Filter ["Filtre 3x3"] F["1 0 1
0 1 0
1 0 1"] end subgraph Output ["Feature Map 3x3"] O["Résultat de
la convolution"] end Input -->|"×"| Filter --> Output class Filter ml-node-main class Output ml-node-accent

Le filtre "glisse" sur l'image et calcule un produit scalaire à chaque position.

Exemple concret avec code couleur - Opération de convolution:

Région de l'image (3x3):

$\begin{bmatrix} \textcolor{#3498db}{1} & \textcolor{#3498db}{0} & \textcolor{#3498db}{2} \\ \textcolor{#3498db}{0} & \textcolor{#3498db}{1} & \textcolor{#3498db}{0} \\ \textcolor{#3498db}{1} & \textcolor{#3498db}{0} & \textcolor{#3498db}{1} \end{bmatrix}$

Filtre (kernel) de détection de bords:

$\begin{bmatrix} \textcolor{#9B7AC4}{-1} & \textcolor{#9B7AC4}{0} & \textcolor{#9B7AC4}{1} \\ \textcolor{#9B7AC4}{-1} & \textcolor{#9B7AC4}{0} & \textcolor{#9B7AC4}{1} \\ \textcolor{#9B7AC4}{-1} & \textcolor{#9B7AC4}{0} & \textcolor{#9B7AC4}{1} \end{bmatrix}$

Calcul du produit scalaire (convolution):

$\text{Sortie} = \sum (\text{image} \times \text{filtre})$

$= (\textcolor{#3498db}{1} \times \textcolor{#9B7AC4}{-1}) + (\textcolor{#3498db}{0} \times \textcolor{#9B7AC4}{0}) + (\textcolor{#3498db}{2} \times \textcolor{#9B7AC4}{1})$

$+ (\textcolor{#3498db}{0} \times \textcolor{#9B7AC4}{-1}) + (\textcolor{#3498db}{1} \times \textcolor{#9B7AC4}{0}) + (\textcolor{#3498db}{0} \times \textcolor{#9B7AC4}{1})$

$+ (\textcolor{#3498db}{1} \times \textcolor{#9B7AC4}{-1}) + (\textcolor{#3498db}{0} \times \textcolor{#9B7AC4}{0}) + (\textcolor{#3498db}{1} \times \textcolor{#9B7AC4}{1})$

$= \textcolor{#e74c3c}{-1} + \textcolor{#27ae60}{2} + \textcolor{#e74c3c}{-1} + \textcolor{#27ae60}{1} = \textcolor{#27ae60}{\mathbf{1}}$

Interprétation: Valeur positive = bord vertical détecte!

Légende des couleurs:

  • $\textcolor{#3498db}{Bleu}$: Pixels de l'image
  • $\textcolor{#9B7AC4}{Violet}$: Poids du filtre (kernel)
  • $\textcolor{#27ae60}{Vert}$: Contributions positives
  • $\textcolor{#e74c3c}{Rouge}$: Contributions négatives
Avancé Exercice manuel: À vous de calculer!

Objectif: Comprendre les opérations CNN à la main (convolution, pooling).

CONTEXTE

Image 4x4 en niveaux de gris :

| | | | | |---|---|---|---| | 1 | 2 | 3 | 0 | | 0 | 1 | 2 | 3 | | 3 | 0 | 1 | 2 | | 2 | 3 | 0 | 1 |

Filtre (kernel) 2x2 de détection de bords :

| | | |---|---| | 1 | -1 | | 1 | -1 |

PARTIE 1 : Convolution

Convolution = somme des produits élément par élément

1.1) Appliquez le filtre en position (0,0) (coin supérieur gauche) 1.2) Appliquez le filtre en position (0,1) 1.3) Calculez toute la feature map (sortie 3x3)

PARTIE 2 : Max Pooling 2x2

2.1) Appliquez max pooling 2x2 sur la feature map obtenue 2.2) Quelle est la taille de sortie ?

PARTIE 3 : Interprétation

3.1) Que détecte ce filtre (différence gauche-droite) ? 3.2) Pourquoi le pooling est-il utile ?

Avancé Solution de l'exercice manuel

SOLUTION DÉTAILLÉE

PARTIE 1 : Convolution

1.1) Position (0,0) :

$$\begin{bmatrix} 1 & 2 \\ 0 & 1 \end{bmatrix} * \begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}$$

$$= 1(1) + 2(-1) + 0(1) + 1(-1) = 1 - 2 + 0 - 1 = \textcolor{#e74c3c}{-2}$$

1.2) Position (0,1) :

$$\begin{bmatrix} 2 & 3 \\ 1 & 2 \end{bmatrix} * \begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}$$

$$= 2 - 3 + 1 - 2 = \textcolor{#e74c3c}{-2}$$

1.3) Feature map complète (3x3) :

| | | | |---|---|---| | -2 | -2 | 0 | | -2 | -2 | 0 | | 0 | 0 | -2 |

PARTIE 2 : Max Pooling 2x2

2.1) Pooling sur la feature map :

  • Zone haut-gauche : max(-2,-2,-2,-2) = -2
  • Zone haut-droite : max(-2,0,-2,0) = 0
  • Zone bas-gauche : max(-2,0,0,0) = 0
  • Zone bas-droite : max(-2,0,-2,-2) = 0

Wait - la feature map est 3x3, le pooling 2x2 avec stride 2 donne une sortie 1x1 ou 2x2 avec padding.

Avec stride 2 sans padding sur 3x3 :

$$\text{Sortie} = \lfloor\frac{3-2}{2}\rfloor + 1 = 1$$

Résultat : $\boxed{\begin{bmatrix} -2 \end{bmatrix}}$ (1x1)

2.2) Taille : $\textcolor{#27ae60}{1 \times 1}$

PARTIE 3 : Interprétation

3.1) Le filtre détecte les transitions horizontales (bords verticaux).

  • Valeur négative = plus clair à gauche
  • Valeur positive = plus clair à droite
  • Zéro = pas de transition

3.2) Max Pooling :

  • Réduit la taille (moins de paramètres)
  • Conserve les features les plus fortes
  • Invariance aux petites translations

$\boxed{\text{CNN = Convolution (détection) + Pooling (réduction)}}$

Légende : $\textcolor{#e74c3c}{Rouge}$: valeurs de convolution

Code

Explorer les données (chiffres)

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Code

Visualiser les chiffres

Ctrl+Entrée
Cliquez sur "Exécuter" pour voir le résultat
Contenu verrouillé
6 / 13

Continuez votre apprentissage

Vous avez exploré 6 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Console Python

Raccourcis clavier
Ctrl/Cmd+Enter Exécuter
Ctrl/Cmd+Shift+/ Commenter
Tab Indenter
Shift+Tab Désindenter
Ctrl/Cmd+Z Annuler
Ctrl/Cmd+Y Rétablir
Ctrl+Entrée pour exécuter
Cliquez sur "Exécuter" pour voir le résultat