Introduction à la Convolution et Pooling
Introduction à la Convolution et Pooling
1. Matrice
Nous allons voir ou revoir quelques notions (le minimum vital) sur les matrices.
1.1. Vocabulaire
• Une matrice est un tableau de n lignes et p colonnes,
contenant desnombres réels.
a11 a12 . . . a1p
21 a22
a . . . a2p
n lignes
. .. .. ..
. . .
. .
an1 an2 . . . anp
p colonnes
• Lorsque il y a autant de lignes que de colonnes, on parle de matrice carrée. Voici une matrice 3 × 3 :
−1 −1 −1
−1 8 −1
−1 −1 −1
• Addition. On peut additionner deux matrices de même taille. L’addition se fait terme à terme. Exemple :
0 1 0 1 2 3 1 3 3
1 −4 1 + 4 5 6 = 5 1 7
0 1 0 7 8 9 7 9 9
• Multiplication par un scalaire. On peut multiplier une matrice par un nombre réel. Exemple :
1 2 3 4 3 6 9 12
3· =
8 7 5 6 24 21 15 18
• Multiplication. On peut multiplier deux matrices. Nous ne donnons pas ici la définition, mais la
multiplication n’est pas effectuée terme à terme. Voici, sans entrer dans les détails, un exemple pour des
CONVOLUTION 2
matrices carrées :
−2 −1 0 1 2 3 −6 −9 −12
−1 1 1 × 4 5 6 = 10 11 12
0 1 2 7 8 9 18 21 24
Nous définirons un peu plus loin la convolution qui est un nouveau type de multiplication de matrices.
1.2. Pooling
Le pooling (regroupement de termes) consiste à transformer une matrice en une matrice plus petite tout en
essayant d’en garder les caractéristiques principales.
Un pooling de taille k transforme une matrice de taille n × p en une matrice de taille k fois plus petite,
c’est-à-dire de taille n//k × p//k. Une sous-matrice de taille k × k de la matrice de départ produit un seul
coefficient de la matrice d’arrivée.
2
a1 a2 b1 b2 c1 c2
2
α β γ
a3 a4 b3 b4 c3 c4
d1 d2 · · · · δ · ·
pooling de taille 2
d3 d4 · · · ·
matrice de taille 2 × 3
matrice de taille 4 × 6
3 5 0 1 1 0
2 1 4 3 2 7 5 4 7
3 2 · · · · 3 · ·
max-pooling
1 3 · · · ·
• Le pooling en moyenne de taille k (average pooling) consiste à retenir la moyenne des termes de chaque
sous-matrice de taille k × k :
3 5 0 1 1 0
11 5
2 1 4 3 2 7 4 2 2
3 2 · · · ·
9
pooling en moyenne 4 · ·
1 3 · · · ·
Ci-dessous, voici le début d’un max-pooling de taille 3. La matrice de départ de taille 9 × 9 est transformée
en une matrice de taille 3 × 3.
CONVOLUTION 3
3
2 5 0 5 3 6 · · ·
3 8 4 1 1 3 0 · · ·
7 0 0 0 2 2 · · ·
8 6 ·
max-pooling de taille 3
matrice de taille 3 × 3
matrice de taille 9 × 9
Le max-pooling, qui ne retient que la valeur la plus élevée par sous-matrice, permet de détecter la présence
d’une caractéristique (par exemple un pixel blanc dans une image noire). Tandis que le pooling en moyenne
prend en compte tous les termes de chaque sous-matrice (par exemple avec 4 pixels d’une image de ciel, on
retient la couleur moyenne).
2.1. Définition
La convolution en deux dimensions est une opération qui :
• à partir d’une matrice d’entrée notée A,
• et d’une matrice d’un motif noté M ,
associe une matrice de sortie A ⋆ M .
Tout d’abord, il faut retourner la matrice M :
m11 m12 m13 m33 m32 m31
m21 m22 m23 m23 m22 m21
m31 m32 m33 m13 m12 m11
0 0 2 0
1 0 0 4 2 2
1 1 1 0 2 2 5 2
matrice A 0 1 1 1 0 0 4 4 4 0
0 0 1 1 01 1 0 0 1 4 5 1
0 1 0 2 2
0 0
0 1 0 00 1 0 0 0
1 4 5
1 0
0 0 1 0 02 0 1 0 1 4 2 0
0 1 0 0 1 3 1 0
0 1 0 0 0 1 4 2 0 0
0 1 0 0 1 3 1 0
1 0 2 2
1 1 convolution A ⋆ M
motif M retourné
Voici un autre schéma pour le calcul d’un autre coefficient. Pour ce calcul, on rajoute des zéros virtuels
autour de la matrice A.
0 0 2 0
1 0 0 4 2 2
1 1 1 0 2 2 5 2
0 1 1 1 0 0 4 4 4 0
0 0 1 1 0 0 1 4 5 1
0 0 1 0 0 2 5 2
0 0 1 0 0 0 1 4 1 0
0 0 1 0 0 0 1 4 2 0
0 1 0 0 1 3 1 0
0 1 0 0101 0 1 4 2 0 0
0 1 0 0 0 1 3 1 0
1 0 0 1 1 2 2
1 1
2 0
Exemple.
Calculons la convolution A ⋆ M définie par :
2 1 3 0
1 1 1 0 2
0 5
⋆ 2 1 0 .
3 3 1 0
1 0 3
2 0 0 2
On commence par retourner M . Pour calculer le premier coefficient de A ⋆ M , on centre le motif sur le
premier coefficient de A, puis on rajoute des zéros virtuels à gauche et en haut. Ensuite on calcule les
produits des coefficients de la matrice M retournée avec les coefficients de A correspondants, et on les
additionne :
0 × 3 + 0 × 0 + 0 × 1 + 0 × 0 + 2 × 1 + 1 × 2 + 0 × 2 + 1 × 0 + 1 × 1.
Cette somme vaut 5, c’est le premier coefficient de A ⋆ M .
0 0 0
×3 ×0 ×1
0 2 1 3 0
5
×0 ×1 ×2 3 0 1
0 1 1 0 5
0 1 2
×2 ×0 ×1
3 3 1 0
2 0 1
2 0 0 2
A M retourné A⋆ M
CONVOLUTION 5
0 0 0
×3 ×0 ×1
2 1 3 0
5 9
×0 ×1 ×2 3 0 1
1 1 0 5
0 1 2
×2 ×0 ×1
3 3 1 0
2 0 1
2 0 0 2
A M retourné A⋆ M
Et ainsi de suite :
2 1 3 0
5 9 10 0
×3 ×0 ×1 3 0 1
1 1 0 5 7 17
0 1 2
×0 ×1 ×2
3 3 1 0
×2 ×0 ×1 2 0 1
2 0 0 2
2 1 3 0
5 9 10 0
3 0 1
1 1 0 5 7 17 19 16
0 1 2
3 3 1 0 0 10 12 11 0
×3 ×0 ×1 2 0 1
2 0 0 2 0 5 10 13 5
×0 ×1 ×2
0 0 0
×2 ×0 ×1
Remarque.
• Il ne faut pas confondre le fait de retourner la matrice avec une opération différente qui s’appelle la
transposition.
• Dans la plupart de nos situations, le motif sera une matrice de taille 3 × 3. Par contre la matrice A pourra
être de très grande taille (par exemple une matrice 600 × 400, codant une image).
• Cependant, si la matrice du motif possède une dimension paire on rajoute des zéros virtuels à gauche ou
en haut (avant de la retourner).
0 0 0 4 3 0
1 2
0 1 2 2 1 0
3 4
0 3 4 0 0 0
• Contrairement au pooling, les motifs disposés pour des calculs d’éléments voisins se superposent. Sur le
dessin ci-dessous le motif est d’abord centré sur le coefficient 8, puis sur le coefficient 9.
CONVOLUTION 6
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
• On verra dans les chapitres « Convolution avec Python » et « Convolution avec tensorflow/keras » plus
de paramètres pour la convolution (comment déplacer le motif, quel choix faire au bord de la matrice A,
etc.).
• Par définition, il faut retourner la matrice M avant de calculer les produits. Cela complique l’usage mais
est cohérent avec la définition donnée pour la dimension 1 et cela permettra d’avoir de bonnes propriétés
mathématiques (voir le chapitre « Convolution avec Python »).
2 −1 7 3 0 2 1 0 1 −6 7 10 2
2 0 0 −2 1 1 1 −1 9 7 10 7 1
×2 ×1 ×0
−5 0 −1 −1 4 0 −1 −2 −3 0 0 −8 0
×1 ×1 ×−1
0 0 0
×0 × − 1 × − 2
A M retourné A⋆ M
Par exemple :
1 2 3 4 5 1.77 3 3.66 4.33 3.11
6 7 8 9 10 1 1 1 4.33 7 8 9 6.33
1
11 12 13 14
15 ⋆
9 1 1 1 ≃ 7.66 12
13 14 9.66.
16 17 18 19 20 1 1 1 11 17 18 19 13
21 22 23 24 25 8.44 13 13.66 14.33 9.77
On remarque des phénomènes de bords dus à l’ajout de zéros virtuels.
entrée : sous-
matrice de A
poids : coef-
ficients de M
sortie
Ce neurone agit comme un élément de convolution. Par exemple si la sous-matrice de A est notée
a11 a12 a13
a21 a22 a23
a31 a32 a33
CONVOLUTION 8
a13 m31
a12 m32
a 11 m33
a23 m21
a22 m22 s
a 21 m23
a33 m11
a32 m12
a 31 m13
On pourrait aussi composer par une fonction d’activation au niveau du neurone, mais on le fera plus tard à
l’aide d’une « couche d’activation ». Plus généralement un neurone de convolution de taille p × q possède
pq arêtes et donc pq poids à définir ou à calculer.
Pour une entrée de taille n × p, il y a donc np neurones de convolutions, chacun ayant 9 arêtes (car le motif
est de taille 3 × 3). Il est très important de comprendre que les poids sont communs à tous les neurones (ce
sont les coefficients de M ). Ainsi, pour une couche de convolution, il y a seulement 9 poids à déterminer
pour définir la couche de convolution (bien que le nombre de neurones puisse être très grand).
Sur le dessin ci-dessous on ne montre que deux neurones. Noter deux choses importantes : (a) deux neurones
différents peuvent avoir certaines entrées communes (sur le dessin les deux carrés 3 × 3 s’intersectent) et
CONVOLUTION 9
(b) deux neurones différents ont les mêmes poids (sur le dessin les arêtes entrantes ayant la même couleur,
ont les mêmes poids).
Remarque.
• Terminologie : le motif M s’appelle aussi le noyau (kernel), le filtre ou encore le masque.
• Le motif peut être d’une taille différente de la taille 3 × 3 considérée dans les exemples qui est cependant
la plus courante.
• Il existe également des variantes avec biais ou fonction d’activation.
• Combinatoire : dans le cas d’une couche complètement connectée, le nombre de poids à calculer serait
énorme. En effet, une couche de np neurones complètement connectée à une entrée de taille n × p
amènerait à calculer (np)2 poids. Pour n = p = 100, cela fait 10 000 neurones et 100 000 000 poids.
Pour rappel, notre couche de convolution est définie par 9 poids (quels que soient n et p).
• D’un point de vue mathématique, une couche de convolution associée au motif M est l’application :
F : Mn,p −→ Mn,p
A 7−→ A ⋆ M
où Mn,p est l’ensemble des matrices de taille n × p.
Si on transforme une matrice en un (grand) vecteur, alors on obtient une application F : Rnp → Rnp .
M1
Mℓ
A
A ⋆ M1
A ⋆ Mℓ
Convolution à partir de plusieurs canaux. Pour traiter une sortie de taille n × p × k du type précédent, qui
va être l’entrée de la couche suivante on doit définir une convolution ayant plusieurs canaux en entrée. Si
les entrées sont les A1 , A2 , . . . , Ak alors un motif M associé à cette entrée de profondeur k est un 3-tenseur
de taille (3, 3, k), c’est-à-dire un tableau à 3 dimensions de la forme 3 × 3 × k (on renvoie au chapitre
« Tenseurs » pour la définition).
3
k
Ce motif M correspond donc à une couche de neurones où chaque neurone possède 3 × 3 × k arêtes. Chaque
neurone est connecté localement à une zone 3 × 3 dans un plan, mais ceci sur toute la profondeur des k
entrées. Le calcul de la sortie du neurone se fait en réalisant la somme de 3 × 3 × k termes. Pour réaliser une
couche de neurones, la zone 3 × 3 se déplace dans le plan, mais s’étend toujours sur toute la profondeur.
M
A1
Ak
A
A⋆M
Convolution à plusieurs filtres à partir de plusieurs canaux. C’est le cas général dans la pratique.
Une entrée donnée par plusieurs canaux A = (A1 , A2 , . . . , Ak ), associée à des motifs M1 , M2 , . . . , Mℓ (qui
sont donc chacun des 3-tenseurs de taille (3, 3, k)) produit une sortie de taille n × p × ℓ, correspondant à
(A ⋆ M1 , A ⋆ M2 , . . . , A ⋆ Mℓ ). Si l’entrée A est de taille (n, p, k) alors la sortie est de taille (n, p, ℓ).
M1
A1 Mℓ
Ak
A
A ⋆ M1
A ⋆ Mℓ
Noter que sur cette figure chaque motif Mi est représenté par carré 3 × 3, alors qu’en fait chacun devrait
être une boîte en 3 dimensions de taille 3 × 3 × k.
Activation. On peut composer par une fonction d’activation φ directement dans le neurone ou bien dans
une couche à part (ce qui est équivalent). Comme d’habitude, la fonction d’activation est la même pour
tous les neurones d’une couche. Ainsi une couche d’activation pour la fonction d’activation φ, transforme
une entrée
a11 a12 . . . a1p φ(a11 ) φ(a12 ) . . . φ(a1p )
φ(a ) φ(a ) . . . φ(a )
21 a22 . . . a2p
a
21 22 2p
en .
. . . . . . . .
.. .. .. .. .. .. .. ..
ai j j)
φ ( ai
matrice A activation φ
Les fonctions d’activation sont les mêmes que celles rencontrées auparavant : ReLU, σ, tanh. . .
Pooling. Une couche de pooling de taille k transforme une entrée de taille n × p en une sortie de taille
n//k × p//k. Nous renvoyons à la première section de ce chapitre pour le max-pooling ou le pooling en
moyenne. Cette opération permet de réduire les données d’un facteur k2 . Par exemple, une entrée de taille
100 × 80 (8000 données) avec un pooling de taille 4 fournit une sortie de taille 25 × 20 (500 données).
Ci-dessous un pooling de taille 3 transforme une matrice 9 × 9 en une matrice 3 × 3.
Dropout. Le dropout (décrochage ou abandon en français) est une technique pour améliorer l’apprentissage
d’un réseau et en particulier pour prévenir le sur-apprentissage. L’idée est de désactiver certains neurones
d’une couche lors des étapes de l’apprentissage. Ces neurones sont choisis au hasard et sont désactivés
temporairement pour une itération (par exemple on peut choisir à chaque itération de désactiver un neurone
avec une probabilité 12 ). Cela signifie que l’on retire toute arête entrante et toute arête sortante de ces
neurones, ce qui revient à mettre les poids à zéro tant pour l’évaluation que pour la rétropropagation.
Lors de l’itération, suivante on choisit de nouveau au hasard les neurones à désactiver. Voir le chapitre
« Probabilités » pour plus de détails.
CONVOLUTION 13
0 255 64 255 0
255 0 127 0 255
A=
64 127
0 127 64
255 0 127 0 255
3.1. Flou
On obtient une image floue par application du motif :
1 1 1
1
M = 1 1 1 .
9
1 1 1
En effet, la convolution par cette matrice M remplace la couleur d’un pixel par la moyenne de la couleur
de ses 9 pixels voisins. Outre l’aspect esthétique, il y a un intérêt fondamental : le flou réduit le bruit. Par
exemple, si un pixel est mauvais (par exemple à cause d’une erreur de l’appareil photo), le flou élimine
cette erreur.
Une variante est le flou gaussien défini par la matrice :
1 2 1
1
M= 2 4 2 .
16
1 2 1
Il existe aussi des flous définis par des matrices M de taille 5 × 5, qui tiennent compte des 25 pixels voisins.
3.2. Piqué
C’est en quelque sorte le contraire du flou ! Le motif est :
0 −1 0
M = −1 5 −1 .
0 −1 0
Voici un exemple avec l’image originale à gauche et l’image transformée à droite qui a l’air plus nette que
l’originale !
De même pour les lignes horizontales (à gauche) ou les lignes à 45◦ (à droite) :
−1 −1 −1 −1 −1 2
M = 2 2 2 , M = −1 2 −1 .
−1 −1 −1 2 −1 −1
Horizontales Diagonales
Ce que l’on retient, c’est que la convolution permet de détecter des lignes verticales ou horizontales par
exemple et donc d’extraire des caractéristiques abstraites d’une image.
3.4. Bords
On peut plus généralement extraire les bords des formes d’une image avec :
−1 −1 −1
M = −1 8 −1 .
−1 −1 −1
CONVOLUTION 16
3.6. Pooling
On termine cette section en illustrant l’action du pooling sur une image.
CONVOLUTION 17
Pooling 4 × 4 en
Max-pooling 4 × 4
moyenne
Image originale
Les images obtenues comportent 16 fois moins de pixels. Les voici agrandies.
4. Rétropropagation
Les formules de la rétropropagation s’étendent sans problème au cas des neurones de convolution. On
commence par reprendre les calculs du chapitre « Gradient » pour le cas classique avant de s’occuper du cas
de la convolution.
Cas classique.
Voici la situation d’un neurone. On ne s’intéresse qu’à une seule de ses arêtes d’entrée : celle associée au
poids a et de valeur d’entrée f . Ce neurone a pour fonction d’activation g. La sortie de ce neurone est
utilisée par le reste du réseau. À la fin, on obtient une valeur de sortie pour la fonction F .
f g
a
F
f⋆ g⋆
a
F
[g⋆′ ]
CONVOLUTION 18
f1 g1
a
f2 g2
a
Ces deux neurones ont un poids commun a, par contre les entrées pour ce poids f1,⋆ et f2,⋆ peuvent être
différentes et les sorties g1,⋆ et g2,⋆ également (même si les fonctions d’activation g1 et g2 sont les mêmes).
Le réseau continue. À la fin, nous obtenons un fonction de sortie F qui dépend des sorties g1 et g2 de nos
deux neurones :
F = ψ(g1 , g2 ).
f1,⋆ g1,⋆
a
[g1,⋆
′
]
ψ
F
f2,⋆ g2,⋆
a
[g2,⋆
′
]
∂F ∂ψ
= f1 · g1′ (· · · + a f1 + · · · )
g1 (· · · + a f1 + · · · ), g2 (· · · + a f2 + · · · )
∂a ∂x
′ ∂ψ
+ f2 · g2 (· · · + a f1 + · · · ) g1 (· · · + a f1 + · · · ), g2 (· · · + a f2 + · · · ) .
∂y
Ce qui donne bien :
∂F ′ ∂F ′ ∂F
= f1,⋆ · g1,⋆ · + f2,⋆ · g2,⋆ · .
∂a ∂ g1 ∂ g2
′ ′
Si les fonctions d’activation de la couche de convolution sont l’identité alors g1,⋆ = 1 et g2,⋆ = 1, on obtient
dans ce cas la formule :
∂F ∂F ∂F
= f1,⋆ · + f2,⋆ · .
∂a ∂ g1 ∂ g2
On retient que chaque entrée associée au poids a contribue proportionnellement à sa valeur dans le calcul
de la dérivée partielle par rapport à ce poids a.
Plus généralement, pour des entrées f i , i = 1, . . . , n, pour n neurones d’une couche de convolution ayant
pour sortie g i , i = 1, . . . , n, et pour un poids a partagé par ces neurones :
n
∂F X ′ ∂F
= f i,⋆ · g i,⋆ · .
∂a i=1
∂ gi