Support de Cours - Deep Learning-Chapitre3-Cnn
Support de Cours - Deep Learning-Chapitre3-Cnn
Support de Cours - Deep Learning-Chapitre3-Cnn
1. Introduction
Mais en 2012, une révolution se produit : lors de la compétition annuelle de vision par
ordinateur ILSVRC, un nouvel algorithme de Deep Learning explose les records ! Il s'agit d'un
réseau de neurones convolutif CNN.
Les réseaux de neurones convolutifs ont une méthodologie similaire à celle des méthodes
traditionnelles d'apprentissage supervisé : ils reçoivent des images en entrée, détectent les
features automatiquement de chacune d'entre elles, puis entraînent un classifieur dessus.
Donc les CNN réalisent eux-mêmes tout le boulot fastidieux d'extraction et description de
features.
Lors de la phase d'entraînement, l'erreur de classification est minimisée afin d'optimiser les
paramètres du classifieur et les features ! De plus, l'architecture spécifique du réseau permet
d'extraire des features de différentes complexités, des plus simples au plus
sophistiquées. L'extraction et la hiérarchisation automatiques des features, qui s'adaptent au
problème donné, constituent une des forces des réseaux de neurones convolutifs.
Aujourd'hui, les réseaux de neurones convolutifs, aussi appelés CNN ou ConvNet pour
Convolutional Neural Network, sont toujours les modèles les plus performants pour la
classification d'images. Cette partie leur est donc naturellement consacrée.
2. Définition CNN
Comme pour les réseaux de neurones ordinaires, les paramètres des couches sont déterminés
par rétropropagation du gradient : l'entropie croisée est minimisée lors de la phase
d'entraînement. Mais dans le cas des CNN, ces paramètres désignent en particulier les
features des images. Voir maintenant les différents types de couches d'un CNN.
3. Couche convolution
La convolution, d’un point de vue simpliste, est le fait d’appliquer un filtre mathématique à
une image. D’un point de vue plus technique, il s’agit de faire glisser une matrice par-dessus
une image, et pour chaque pixel, utiliser la somme de la multiplication de ce pixel par la valeur
de la matrice. Cette technique nous permet de trouver des parties de l’image qui pourraient
nous être intéressantes. Prenons la Figure ci-dessous à gauche comme exemple d’image et la
Figure à droite comme exemple de
F
M
Exemple de valeurs d’une
Exemple simpliste des valeurs des matrice utilisée comme
pixels d’une image 5x5 filtre
Dans le cas de la Figure 17, les valeurs sont binaires. Dans un cas réel, les valeurs devraient
varier entre 0 et 255. Dans la Figure 18, les valeurs sont représentées par des 1 et 0. Dans un
cas réel, ces valeurs sont continues et peuvent être positives ou négatives.
Appliquer le filtre sur l’image : dans la
matrice image M, nous pouvons voir que
chaque valeur des pixels de l’image tuile
(les cases orange) est multipliée par chaque
valeur correspondante du filtre (1x1, 1x0,
1x1 ….). Puis additionner tous ces valeurs
pour obtenir une seule valeur ’4’ qui fera
partie d’une nouvelle image convoluée.
Le filtre doit se déplacer d’une case à chaque itération jusqu’à ce que la première ligne soit
finie. Lorsque nous avons fini la première ligne, le filtre « descend » d’une case et la même
procédure se répète pour chaque ligne et colonne. Voir l’animation suivante :
Noté qu’une convolution 3x3 de profondeur 1 effectuée sur une carte de caractéristiques
d'entrée 5x5, également de profondeur 1. Comme il y a neuf emplacements 3x3 possibles
pour extraire les tuiles de la carte de caractéristiques 5x5, cette convolution génère une carte
de caractéristiques de sortie 3x3.
Un réseau de neurones à convolution contient de multiples filtres et ces filtres sont appliqués
sur l’image d’origine. Après la première étape nous avons donc autant de nouvelles images
que de filtres. La phase de convolution peut aussi être vue comme des couches de neurones
cachées où chaque neurone n’est connecté qu’à quelques neurones de la couche suivante.
Pour expliquer comment un filtre peut trouver des parties intéressantes dans les images. Prenons le
Filtre précédant. Les valeurs qui sont à 1 forment un « X ». Pendant la phase de convolution, lorsque
ce filtre sera appliqué à une forme qui correspond exactement à un « X », alors la valeur obtenue sera
plus élevée. Moins la forme de l’image correspond à la forme du filtre, plus la valeur obtenue sera
basse. Nous pouvons donc réduire la taille de l’image et en faire ressortir les éléments intéressants.
Afin de démontrer les effets d’une phase de convolution, la figure suivante, qui est une image de
synthèse du bâtiment B, sera modifiée avec plusieurs filtres mathématiques. Par exemple, si nous
voulons trouver des arêtes, nous pouvons utiliser les valeurs du filtre F2.
F2
Les filtres sont aussi adaptés à chaque itération d’apprentissage car les valeurs des filtres
mathématiques utilisés sont des poids comme dans les réseaux de neurones multicouches
ReLu est très utilisée dans les réseaux de neurones à convolution car il s’agit d’une fonction rapide à
calculer : 𝑓(𝑦) = 𝑚𝑎𝑦(0,𝑦). Sa performance est donc meilleure que d’autres fonctions où des opérations
coûteuses doivent être effectuées.
Contrairement aux méthodes traditionnelles, les features ne sont pas pré-définies selon un formalisme
particulier (par exemple SIFT), mais apprises par le réseau lors la phase d'entraînement ! Les noyaux
des filtres désignent les poids de la couche de convolution. Ils sont initialisés puis mis à jour
par rétropropagation du gradient.
C'est là toute la force des réseaux de neurones convolutifs : ceux-ci sont capables de déterminer tout
seul les éléments discriminants d'une image, en s'adaptant au problème posé. Par exemple, si la
question est de distinguer les chats des chiens, les features automatiquement définies peuvent décrire
la forme des oreilles ou des pattes.
4. Pooling
Ce type de couche est souvent placé entre deux couches de convolution : elle reçoit en entrée plusieurs
feature maps, et applique à chacune d'entre elles l'opération de pooling. L'opération de pooling
consiste à réduire la taille des images, tout en préservant leurs caractéristiques importantes. Pour cela,
on découpe l'image en cellules régulière, puis on garde au sein de chaque cellule la valeur maximale.
La méthode utilisée consiste à imaginer une fenêtre de 2 ou 3 pixels qui glisse au-dessus d’une image,
comme pour la convolution. Mais, cette fois-ci, nous faisons des pas de 2 pour une fenêtre de taille 2,
et des pas de 3 pour 3 pixels. La taille de la fenêtre est appelée « kernel size » et les pas s’appellent
«strides » Pour chaque étape, nous prenons la valeur la plus haute parmi celles présentes dans la
fenêtre et cette valeur constitue un nouveau pixel dans une nouvelle image. Ceci s’appelle Max
Pooling.
Les valeurs maximales sont repérées de manière moins exacte dans les feature maps obtenues après
pooling que dans celles reçues en entrée – c'est en fait un grand avantage ! En effet, lorsqu'on veut
reconnaître un chien par exemple, ses oreilles n'ont pas besoin d'être localisées le plus précisément
possible : savoir qu'elles se situent à peu près à côté de la tête suffit !
Ainsi, la couche de pooling rend le réseau moins sensible à la position des features : le fait qu'une
feature se situe un peu plus en haut ou en bas, ou même qu'elle ait une orientation légèrement
différente ne devrait pas provoquer un changement radical dans la classification de l'image.
5. Couche fully-connected
La couche fully-connected constitue toujours la dernière couche d'un réseau de neurones. Ce type de
couche reçoit un vecteur en entrée et produit un nouveau vecteur en sortie. Pour cela, elle applique
une combinaison linéaire puis éventuellement une fonction d'activation aux valeurs reçues en entrée.
La dernière couche fully-connected permet de classifier l'image en entrée du réseau : elle renvoie un
vecteur de taille N , où N est le nombre de classes dans notre problème de classification d'images.
Chaque élément du vecteur indique la probabilité pour l'image en entrée d'appartenir à une classe.
Par exemple, si le problème consiste à distinguer les chats des chiens, le vecteur final sera de taille 2 :
le premier élément (respectivement, le deuxième) donne la probabilité d'appartenir à la classe
"chat" (respectivement "chien"). Ainsi, le vecteur [0.9 0.1] signifie que l'image a 90% de chances de
représenter un chat.
Pour calculer les probabilités, la couche fully-connected multiplie donc chaque élément en entrée par
un poids, fait la somme, puis applique une fonction d'activation (logistique si N=2 , softmax si N>2) :
Ce traitement revient à multiplier le vecteur en entrée par la matrice contenant les poids. Le fait
que chaque valeur en entrée soit connectée avec toutes les valeurs en sortie explique le terme fully-
connected.
Un réseau de neurones à convolution peut avoir plusieurs étapes de convolution, ReLu et Pooling. Une
règle à respecter est que la fonction de ReLu doit obligatoirement être appliquée après une étape de
convolution afin d’avoir une réponse non-linéaire, mais le Pooling n’est pas obligatoire.
Après être passé par toutes les étapes de convolution, ReLu et Pooling, nous pouvons passer à la
classification des images. La dernière phase consiste à envoyer tous les pixels dans un réseau de
neurones multicouches. Étant donné que nous avons pu récupérer les parties les plus importantes
d’une image que nous avons condensée, la phase de classification sera beaucoup plus performante
qu’en utilisant un réseau de neurones artificiels sans convolution.
Un CNN est simplement un empilement de plusieurs couches de convolution, pooling, correction ReLU
et fully-connected. Chaque image reçue en entrée va donc être filtrée, réduite et corrigée plusieurs
fois, pour finalement former un vecteur. Dans le problème de classification, ce vecteur contient les
probabilités d'appartenance aux classes.
Tous les réseaux de neurones convolutifs doivent commencer par une couche de convolution et finir
par une couche fully-connected. Les couches intermédiaires peuvent s'empiler de différentes
manières, à condition que la sortie d'une couche ait la même structure que l'entrée de la suivante. Par
exemple, une couche fully-connected, qui renvoie toujours un vecteur, ne peut pas être placée avant
une couche de pooling, puisque cette dernière doit recevoir une matrice 3D.
Plus il y a de couches, plus le réseau de neurones est "profond" : on est en plein dans le Deep Learning!
La première couche de convolution apprend des features simples, qui représentent des éléments de
structure rudimentaires de l'image (contours, coins...) Plus les couches de convolution sont "hautes",
c'est-à-dire loin de l'entrée du réseau, plus les features apprises sont complexes : celles-ci se
composent des features plus simples des couches précédentes. Un carré est un exemple
de feature complexe, formée de contours et de coins.
Les couches de convolution les plus hautes apprennent donc des features sophistiquées : par exemple
couche convolution 2, dans le cas de la reconnaissance de chat ci-dessous, elles peuvent correspondre
aux oreilles, nez ou l’oeuil..
Un réseau de neurones convolutif se distingue d'un autre par la façon dont les couches sont
empilées, mais également paramétrées. Les couches de convolution et de pooling possèdent
en effet des hyperparamètres, c'est-à-dire des paramètres dont vous devez préalablement
définir la valeur.
1. Le nombre de filtres K
2. La taille F des filtres : chaque filtre est de dimensions F×F×D pixels.
3. Le pas S avec lequel on fait glisser la fenêtre correspondant au filtre sur l'image. Par
exemple, un pas de 1 signifie qu'on déplace la fenêtre d'un pixel à la fois.
4. Le zero-padding P : : on ajoute à l'image en entrée de la couche un contour noir
d'épaisseur P pixels. Sans ce contour, les dimensions en sortie sont plus petites. Ainsi,
plus on empile de couches de convolution avec P=0, plus l'image en entrée du réseau
rétrécit. On perd donc beaucoup d'informations rapidement, ce qui rend la tâche
d'extraction de features difficile.
Pour chaque image de taille W×H×D en entrée, la couche de convolution renvoie une matrice
𝑊−𝐹+2𝑃 𝐻−𝐹+2𝑃
de dimensions 𝑊𝑐 ∗ 𝐻𝑐 ∗ 𝐷𝑐 , 𝑜ù 𝑊𝑐 = + 1, 𝐻𝑐 = + 1 𝑒𝑡 𝐷𝑐 = 𝐾
𝑆 𝑆
𝐹−1
Choisir 𝑃 = 2 𝑒𝑡 𝑆 = 1 permet ainsi d’obtenir des features maps de même largeur et
hauteur que celles reçues en entrée.
• La taille F des cellules : l'image est découpée en cellules carrées de taille F×F pixels
• Le pas S : les cellules sont séparées les unes des autres de S pixels
Pour chaque image de taille W×H×D en entrée, la couche de pooling renvoie une matrice de
𝑊−𝐹 𝐻−𝐹
dimensions : 𝑊𝑝 ∗ 𝐻𝑝 ∗ 𝐷𝑝 , 𝑜ù 𝑊𝑝 = 𝑆 + 1, 𝐻𝑝 = 𝑆 + 1 𝑒𝑡 𝐷𝑝 = 𝐷
Tout comme l'empilement, le choix des hyperparamètres se fait selon un schéma classique :
• Pour la couche de convolution, les filtres sont de petite taille et glissés sur l'image d'un
pixel à la fois. La valeur du zero-padding est choisie de sorte que la largeur et la hauteur du
volume en entrée ne soient pas modifiées en sortie. En général, on choisit alors F=3, P=1,
S=1 ou F=5, P=2, S=1
• Pour la couche de pooling, F=2 et S=2 est un choix judicieux. Cela permet d'éliminer 75%
des pixels en entrée. On peut également trouver F=3 et S=2 : dans ce cas, les cellules se
chevauchent. Choisir des cellules de plus grande taille provoque une perte trop
importante d'informations, et donne de moins bons résultats en pratique
Voilà, vous avez les bases pour construire votre propre CNN ! En pratique, il est conseillé de
ne pas créer un réseau de neurones convolutif de A à Z pour résoudre votre problème : la
stratégie la plus efficace consiste à prendre un réseau existant qui classifie bien une large
collection d'images (comme ImageNet) et d'appliquer le Transfer Learning – voir la prochaine
section !