Comment les couches convolutives fonctionnent-elles dans les réseaux de neurones d’apprentissage profond?

Tweet Partager Partager

Dernière mise à jour le 17 avril 2020

Les couches convolutives sont les principaux blocs de construction utilisés dans les réseaux de neurones convolutifs.

Une convolution est la simple application d’un filtre sur une entrée qui aboutit à une activation. L’application répétée du même filtre à une entrée aboutit à une carte d’activations appelée carte de caractéristiques, indiquant les emplacements et la force d’une caractéristique détectée dans une entrée, telle qu’une image.

L’innovation du neural convolutif réseaux est la capacité d’apprendre automatiquement un grand nombre de filtres en parallèle spécifiques à un jeu de données d’apprentissage sous les contraintes d’un problème de modélisation prédictive spécifique, comme la classification d’images. Le résultat est des fonctionnalités très spécifiques qui peuvent être détectées n’importe où sur les images d’entrée.

Dans ce tutoriel, vous découvrirez comment les convolutions fonctionnent dans le réseau neuronal convolutif.

Après avoir terminé ce tutoriel, vous saurez:

  • Les réseaux de neurones convolutionnels appliquent un filtre à une entrée pour créer une carte des caractéristiques qui résume la présence d’entités détectées dans l’entrée.
  • Les filtres peuvent être fabriqués à la main , comme les détecteurs de ligne, mais l’innovation des réseaux de neurones convolutifs est d’apprendre les filtres pendant l’entraînement dans le contexte d’un problème de prédiction spécifique.
  • Comment calculer la carte des caractéristiques pour convolutif à une et deux dimensions couches dans un réseau neuronal convolutif.

Lancez votre projet avec mon nouveau livre Deep Learning for Computer Vision, comprenant des didacticiels étape par étape et les fichiers de code source Python pour tous les exemples.

Commençons.

Une douceur Introduction aux couches convolutives pour les réseaux de neurones d’apprentissage en profondeur
Photo de mendhak, certains droits réservés.

Présentation du didacticiel

Ce didacticiel est divisé en quatre parties; ce sont:

  1. Convolution dans les réseaux de neurones convolutifs
  2. Convolution en vision par ordinateur
  3. Puissance des filtres appris
  4. Exemple de travail Couches convolutives

Vous voulez des résultats avec le Deep Learning pour la vision par ordinateur?

Take my cours intensif gratuit de 7 jours par e-mail maintenant (avec exemple de code).

Cliquez pour vous inscrire et obtenez également une version PDF gratuite du cours.

Téléchargez votre mini- Cours

Convolution dans les réseaux de neurones convolutifs

Le réseau de neurones convolutifs, ou CNN en abrégé, est un type spécialisé de modèle de réseau neuronal conçu pour travailler avec des données d’image bidimensionnelles, bien qu’ils puissent être utilisés avec des données unidimensionnelles et tridimensionnelles.

La couche convolutive est au cœur du réseau neuronal convolutif donne son nom au réseau. Cette couche effectue une opération appelée « convolution ».

Dans le contexte d’un réseau de neurones convolutif, une convolution est une opération linéaire qui implique la multiplication d’un ensemble de poids avec l’entrée, un peu comme une réseau neuronal. Étant donné que la technique a été conçue pour une entrée bidimensionnelle, la multiplication est effectuée entre un tableau de données d’entrée et un tableau bidimensionnel de poids, appelé filtre ou noyau.

Le filtre est plus petit que les données d’entrée et le type de multiplication appliqué entre un patch de la taille d’un filtre de l’entrée et le filtre est un produit scalaire. Un produit scalaire est la multiplication par élément entre le patch de la taille du filtre de l’entrée et le filtre, qui est ensuite additionné, ce qui donne toujours une valeur unique. Comme il en résulte une valeur unique, l’opération est souvent appelée « produit scalaire ».

L’utilisation d’un filtre plus petit que l’entrée est intentionnelle car elle permet au même filtre (ensemble de poids) d’être multiplié par le tableau d’entrée plusieurs fois à différents points de l’entrée. Plus précisément, le filtre est appliqué systématiquement à chaque partie superposée ou à chaque zone de taille de filtre des données d’entrée, de gauche à droite, de haut en bas.

Cette application systématique du même filtre sur une image est une idée puissante . Si le filtre est conçu pour détecter un type spécifique de fonctionnalité dans l’entrée, l’application de ce filtre systématiquement sur toute l’image d’entrée permet au filtre de découvrir cette fonctionnalité n’importe où dans l’image. Cette capacité est communément appelée invariance de traduction, par ex. l’intérêt général de savoir si la fonctionnalité est présente plutôt que là où elle était présente.

L’invariance à la traduction locale peut être une propriété très utile si nous nous soucions davantage de si une caractéristique est présente plutôt que là où elle se trouve.Par exemple, pour déterminer si une image contient un visage, nous n’avons pas besoin de connaître l’emplacement des yeux avec une précision au pixel près, nous avons juste besoin de savoir qu’il y a un œil sur le côté gauche du visage et un œil sur le côté droit. côté du visage.

– Page 342, Deep Learning, 2016.

Le résultat de la multiplication du filtre avec le tableau d’entrée une fois est une valeur unique. Comme le filtre est appliqué plusieurs fois au tableau d’entrée, le résultat est un tableau bidimensionnel de valeurs de sortie qui représentent un filtrage de l’entrée. En tant que tel, le tableau de sortie bidimensionnel de cette opération est appelé une «carte de caractéristiques».

Une fois qu’une carte de caractéristiques est créée, nous pouvons passer chaque valeur de la carte de caractéristiques par une ReLU, tout comme nous le faisons pour les sorties d’un calque entièrement connecté.

Exemple de filtre Appliqué à une entrée bidimensionnelle pour créer une carte d’entités

Si vous venez d’un domaine de traitement de signal numérique ou d’un domaine connexe des mathématiques, vous pouvez comprendre l’opération de convolution sur une matrice comme quelque chose de différent . Plus précisément, le filtre (noyau) est inversé avant d’être appliqué à l’entrée. Techniquement, la convolution telle que décrite dans l’utilisation des réseaux de neurones convolutifs est en fait une « corrélation croisée ». Néanmoins, en apprentissage profond, elle est appelée opération « convolution ».

De nombreuses bibliothèques d’apprentissage automatique implémentent la corrélation croisée, mais l’appellent convolution.

– Page 333, Deep Learning, 2016.

En résumé, nous avons une entrée, telle qu’une image de valeurs de pixels, et nous avons un filtre, qui est un ensemble de poids, et le filtre est systématiquement appliqué aux données d’entrée pour créer une carte des caractéristiques .

Convolution en vision par ordinateur

L’idée d’appliquer l’opération convolutive aux données d’image n’est pas nouvelle ou unique aux réseaux de neurones convolutifs; c’est une technique courante utilisée en vision par ordinateur.

Historiquement, les filtres étaient conçus à la main par des experts en vision par ordinateur, qui étaient ensuite appliqués à une image pour aboutir à une carte des caractéristiques ou à la sortie de l’application du filtre l’analyse de l’image est plus facile d’une certaine manière.

Par exemple, ci-dessous est un filtre d’élément 3 × 3 fabriqué à la main pour détecter les lignes verticales:

1
2
3

0.0, 1.0, 0.0
0.0, 1.0, 0.0
0.0, 1.0, 0.0

Appliquer ce filtre à un l’image donnera une carte des caractéristiques qui ne contient que des lignes verticales. C’est un détecteur de ligne verticale.

Vous pouvez le voir à partir des valeurs de poids dans le filtre; toutes les valeurs de pixels de la ligne verticale centrale seront activées positivement et toutes les valeurs de chaque côté seront activées négativement. Faire glisser systématiquement ce filtre sur les valeurs de pixels d’une image ne peut mettre en évidence que les pixels de ligne verticale.

Un détecteur de ligne horizontale peut également être créé et appliqué à l’image, par exemple:

1
2
3

0.0, 0.0, 0.0
1.0, 1.0, 1.0
0.0, 0.0, 0.0

Combinaison des résultats des deux filtres, par exemple en combinant les deux cartes d’entités, toutes les lignes d’une image seront mises en surbrillance.

Une suite de dizaines, voire de centaines d’autres petits filtres peut être conçue pour détecter d’autres caractéristiques de l’image.

L’innovation de l’utilisation de l’opération de convolution dans un réseau de neurones est que les valeurs du filtre sont des poids à apprendre lors de l’apprentissage du réseau.

Le réseau apprendra quels types de fonctionnalités extrait de l’entrée. Plus précisément, lors de la formation en descente de gradient stochastique, le réseau est obligé d’apprendre à extraire des caractéristiques de l’image qui minimisent la perte pour la tâche spécifique que le réseau est entraîné à résoudre, par ex. extraire les fonctionnalités qui sont les plus utiles pour classer les images comme chiens ou chats.

Dans ce contexte, vous pouvez voir que c’est une idée puissante.

Puissance des filtres appris

L’apprentissage d’un filtre unique spécifique à une tâche d’apprentissage automatique est une technique puissante.

Pourtant, les réseaux de neurones convolutifs réalisent beaucoup plus dans la pratique .

Filtres multiples

Les réseaux de neurones convolutifs n’apprennent pas un seul filtre; ils apprennent en fait plusieurs fonctionnalités en parallèle pour une entrée donnée.

Par exemple, il est courant pour une couche convolutive d’apprendre de 32 à 512 filtres en parallèle pour une entrée donnée.

Cela donne au modèle 32, voire 512, différentes façons d’extraire des caractéristiques d’une entrée, ou de nombreuses façons différentes à la fois « d’apprendre à voir » et après l’entraînement, de nombreuses façons différentes de « voir » les données d’entrée.

Cette diversité permet une spécialisation, par exemple pas seulement les lignes, mais les lignes spécifiques vues dans vos données d’entraînement spécifiques.

Plusieurs canaux

Les images couleur ont plusieurs canaux, généralement un pour chaque canal de couleur, comme le rouge, le vert, et bleu.

Du point de vue des données, cela signifie qu’une seule image fournie en entrée du modèle est en fait trois images.

Un filtre doit toujours avoir le même numéro de canaux comme entrée, souvent appelée «profondeur». Si une image d’entrée a 3 canaux (par exemple une profondeur de 3), alors un filtre appliqué à cette image doit également avoir 3 canaux (par exemple une profondeur de 3). Dans ce cas, un filtre 3 × 3 serait en fait 3x3x3 ou pour les lignes, les colonnes et la profondeur. Indépendamment de la profondeur de l’entrée et de la profondeur du filtre, le filtre est appliqué à l’entrée à l’aide d’une opération de produit scalaire qui se traduit par une valeur unique.

Cela signifie que si une couche convolutive a 32 filtres, ces 32 filtres ne sont pas seulement bidimensionnels pour l’entrée d’image bidimensionnelle, mais sont également tridimensionnels, ayant des poids de filtre spécifiques pour chacun des trois canaux. Pourtant, chaque filtre aboutit à une seule carte de caractéristiques. Ce qui signifie que la profondeur de sortie de l’application de la couche convolutive avec 32 filtres est de 32 pour les 32 cartes d’entités créées.

Couches multiples

Les couches convolutives ne sont pas seulement appliquées aux données d’entrée , par exemple valeurs de pixels brutes, mais elles peuvent également être appliquées à la sortie d’autres couches.

L’empilement de couches convolutives permet une décomposition hiérarchique de l’entrée.

Considérez que les filtres qui fonctionnent directement sur les valeurs de pixel brutes apprendront à extraire des entités de bas niveau, telles que des lignes.

Les filtres qui opèrent sur la sortie des couches de première ligne peuvent extraire des entités qui sont des combinaisons d’entités de niveau inférieur, tels que des entités qui comprennent plusieurs lignes pour exprimer des formes.

Ce processus se poursuit jusqu’à ce que des couches très profondes extraient des visages, des animaux, des maisons, etc.

C’est exactement ce que nous voyons en pratique. L’abstraction des fonctionnalités à des ordres de plus en plus élevés à mesure que la profondeur du réseau augmente.

Exemple travaillé de couches convolutives

La bibliothèque d’apprentissage en profondeur Keras fournit une suite de couches convolutives.

Nous pouvons mieux comprendre l’opération de convolution en regardant quelques exemples travaillés avec des données artificielles et des filtres fabriqués à la main.

Dans cette section, nous examinerons à la fois une couche de convolution unidimensionnelle et un exemple de couche convolutive bidimensionnelle pour à la fois rendre l’opération de convolution concrète et fournir un exemple concret d’utilisation des couches Keras.

Exemple de couche convolutionnelle 1D

Nous pouvons définir un entrée dimensionnelle qui a huit éléments tous avec la valeur de 0.0, avec une bosse de deux éléments au milieu avec les valeurs 1.0.

1

L’entrée de Keras doit être en trois dimensions pour une couche convolutive 1D.

La première dimension fait référence à chaque échantillon d’entrée; dans ce cas, nous n’avons qu’un seul échantillon. La deuxième dimension fait référence à la longueur de chaque échantillon; dans ce cas, la longueur est de huit. La troisième dimension fait référence au nombre de canaux dans chaque échantillon; dans ce cas, nous n’avons qu’un seul canal.

Par conséquent, la forme du tableau d’entrée sera.

1
2
3

# définir l’entrée data
data = asarray ()
data = data.reshape (1, 8, 1)

Nous allons définir un modèle qui s’attend à ce que les échantillons d’entrée aient la forme.

Le modèle aura un seul filtre avec la forme de 3, ou trois éléments de large. Keras se réfère à la forme du filtre comme kernel_size.

1
2
3

# create model
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))

Par défaut, les filtres d’une couche convolutive sont initialisés avec des poids aléatoires. Dans cet exemple artificiel, nous spécifierons manuellement les poids pour le filtre unique. Nous allons définir un filtre capable de détecter les bosses, c’est-à-dire une valeur d’entrée élevée entourée de valeurs d’entrée faibles, comme nous l’avons défini dans notre exemple d’entrée.

Le filtre à trois éléments que nous définirons se présente comme suit:

1

La couche convolutive a également une valeur d’entrée de biais qui nécessite également un poids que nous mettrons à zéro.

Par conséquent, nous pouvons forcer les poids de notre couche convolutive unidimensionnelle à utiliser notre filtre artisanal comme suit:

Les poids doivent être spécifiés dans à Structure en trois dimensions, en termes de lignes, de colonnes et de canaux. Le filtre comporte une seule ligne, trois colonnes et un canal.

Nous pouvons récupérer les pondérations et confirmer qu’elles ont été définies correctement.

1
2

# confirmer qu’ils ont été stockés
print (model.get_weights ())

Enfin, nous pouvons appliquer le filtre unique à nos données d’entrée.

Nous pouvons y parvenir en appelant la fonction prédire () sur le modèle. Cela renverra directement la carte des caractéristiques: c’est la sortie de l’application du filtre systématiquement à travers la séquence d’entrée.

1
2
3

# appliquer le filtre aux données d’entrée
yhat = model.predict (data)
print (yhat )

Reliant tout cela ensemble, l’exemple complet est listés ci-dessous.

L’exécution de l’exemple imprime d’abord les poids du réseau; c’est la confirmation que notre filtre artisanal a été défini dans le modèle comme prévu.

Ensuite, le filtre est appliqué au modèle d’entrée et la carte des caractéristiques est calculée et affichée. Nous pouvons voir à partir des valeurs de la carte des caractéristiques que la bosse a été correctement détectée.

1
2
3
4
5
6
7
8
9
10

],
],
]], dtype = float32), array (, dtype = float32)]
]]

Regardons de plus près ce qui s’est passé ici.

Rappelez-vous que l’entrée est un vecteur de huit éléments avec les valeurs:.

Premièrement, le filtre à trois éléments a été appliqué aux trois premières entrées de l’in mis en calculant le produit scalaire (opérateur « . »), qui a abouti à une valeur de sortie unique dans la carte des caractéristiques de zéro.

1
2

from numpy import asarray
print (asarray (). dot (asarray ()))

Dans notre exemple manuel, c’est comme suit:

1

. = 0

Le filtre a ensuite été déplacé le long d’un élément de la séquence d’entrée et le processus ont été répétés; plus précisément, le même filtre a été appliqué à la séquence d’entrée aux index 1, 2 et 3, ce qui a également abouti à une sortie nulle dans la carte des caractéristiques.

1

. = 0

Nous sommes systématiques, donc encore une fois, le Le filtre est déplacé le long d’un autre élément de l’entrée et appliqué à l’entrée aux index 2, 3 et 4. Cette fois, la sortie est une valeur de un dans la carte des caractéristiques. Nous avons détecté la fonctionnalité et l’avons activée de façon appropriée.

1

. = 1

Le processus est répété jusqu’à ce que nous calculions l’ensemble carte des caractéristiques.

1

Notez que la carte des caractéristiques comporte six éléments, alors que notre entrée en a huit. Il s’agit d’un artefact de la manière dont le filtre a été appliqué à la séquence d’entrée. Il existe d’autres moyens d’appliquer le filtre à la séquence d’entrée qui modifie la forme de la carte d’entités résultante, comme le remplissage, mais nous ne discuterons pas de ces méthodes dans cet article.

Vous pouvez imaginer cela avec différents entrées, nous pouvons détecter la caractéristique avec plus ou moins d’intensité, et avec des poids différents dans le filtre, que nous détecterions différentes caractéristiques dans la séquence d’entrée.

Exemple de couche convolutionnelle 2D

Nous pouvons étendre l’exemple de détection de bosses de la section précédente à un détecteur de ligne verticale dans une image bidimensionnelle.

Encore une fois , nous pouvons contraindre l’entrée, dans ce cas à une image d’entrée carrée de 8 × 8 pixels avec un seul canal (par exemple en niveaux de gris) avec une seule ligne verticale au milieu.

1
2
3
4
5
6
7
8

L’entrée d’un calque Conv2D doit être en quatre dimensions.

La première dimension définit les échantillons; dans ce cas, il n’y a qu’un seul échantillon. La deuxième dimension définit le nombre de lignes; dans ce cas, huit. La troisième dimension définit le nombre de colonnes, encore huit dans ce cas, et enfin le nombre de canaux, qui est un dans ce cas.

Par conséquent, l’entrée doit avoir la forme à quatre dimensions ou dans ce cas.

Nous définirons le Conv2D avec un seul filtre comme nous l’avons fait dans la section précédente avec l’exemple Conv1D.

Le filtre sera bidimensionnel et carré avec la forme 3 × 3. Le calque s’attendra à ce que les échantillons d’entrée aient la forme ou.

1
2
3

# create model
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))

Nous allons définir une verticale filtre de détecteur de ligne pour détecter la seule ligne verticale dans nos données d’entrée.

Le filtre se présente comme suit:

1
2
3

0, 1, 0
0, 1, 0
0, 1, 0

Nous pouvons implémenter ceci comme suit:

Enfin, nous allons appliquez le filtre à l’image d’entrée, ce qui donnera une carte des caractéristiques dont nous nous attendons à montrer la détection de la ligne verticale dans l’image d’entrée.

1
2
# appliquer le filtre aux données d’entrée
yhat = model.predict (data)

La forme de la sortie de la carte des caractéristiques sera en quatre dimensions avec la forme. Nous allons effectuer un seul lot et nous avons un seul filtre (un filtre et un canal d’entrée), donc la forme de sortie est. Nous pouvons imprimer le contenu de la carte des caractéristiques uniques comme suit:

1
2
3

for r in range (yhat.shape):
# imprime chaque colonne de la ligne
print (pour c in range ( yhat.shape)])

Lier tout cela ensemble , l’exemple complet est listé ci-dessous.

L’exécution de l’exemple confirme d’abord que le filtre fabriqué à la main a été correctement défini dans les pondérations des couches

Ensuite, la carte des entités calculées est imprimée. Nous pouvons voir à l’échelle des nombres que le filtre a effectivement détecté la seule ligne verticale avec une forte activation au milieu de la carte des caractéristiques.

Regardons de plus près ce qui a été calculé.

Tout d’abord, le filtre a été appliqué au coin supérieur gauche de l’image, ou à un patch d’image de 3 × 3 éléments. Techniquement, le patch d’image est tridimensionnel avec un seul canal et le filtre a les mêmes dimensions. Nous ne pouvons pas implémenter cela dans NumPy en utilisant la fonction dot (), à la place, nous devons utiliser la fonction tensordot () afin de pouvoir additionner de manière appropriée toutes les dimensions, par exemple:

Ce calcul donne une valeur de sortie unique de 0,0, par exemple, la fonction n’a pas été détectée. Cela nous donne le premier élément dans le coin supérieur gauche de la carte des caractéristiques.

Manuellement, ce serait comme suit:

1
2
3

0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0, 0

Le filtre est déplacé le long d’une colonne vers la gauche et le processus est répété. Là encore, la fonctionnalité n’est pas détectée.

1
2
3

0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1

Encore un déplacement vers la gauche vers la colonne suivante et la fonctionnalité est détectée pour la première fois, ce qui entraîne une forte activation.

1
2
3

0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1

Ce processus est répété jusqu’à ce que le bord du filtre repose contre le bord ou la dernière colonne de l’image d’entrée. Cela donne le dernier élément de la première ligne complète de la carte des caractéristiques.

1

Le filtre descend ensuite d’une ligne et revient à la première colonne et le processus est lié de gauche à droite pour donner la deuxième ligne de la carte des caractéristiques. Et jusqu’à ce que le bas du filtre repose sur la dernière ou la dernière ligne de l’image d’entrée.

Encore une fois, comme dans la section précédente, nous pouvons voir que la carte des caractéristiques est une matrice 6 × 6, plus petite que l’image d’entrée 8 × 8 en raison des limitations de la façon dont le filtre peut être appliqué à l’image d’entrée.

Lectures complémentaires

Cette section fournit plus de ressources sur le sujet si vous êtes cherche à aller plus loin.

Messages

  • Cours intensif sur les réseaux de neurones convolutionnels pour l’apprentissage automatique

Livres

  • Chapitre 9: Réseaux convolutifs, Deep Learning, 2016.
  • Chapitre 5: Deep Learning pour la vision par ordinateur, Deep Learning avec Python, 2017.

API

  • API Keras Convolutional Layers
  • API numpy.asarray

Résumé

Dans ce tutoriel, vous avez découvert comment les convolutions fonctionnent dans le réseau de neurones convolutifs.

Plus précisément, vous avez appris:

  • Les réseaux de neurones convolutifs appliquent un filtre à une entrée pour créer une carte des entités qui résume la présence d’entités détectées dans l’entrée.
  • Les filtres peuvent être fabriqués à la main, comme les détecteurs de ligne, mais l’innovation des réseaux de neurones convolutifs consiste à apprendre les filtres pendant l’entraînement dans le contexte d’un problème de prédiction spécifique.
  • Comment calculer la carte des caractéristiques pour les couches convolutives à une et deux dimensions dans un réseau de neurones convolutifs.

Avez-vous des questions?
Posez vos questions dans les commentaires ci-dessous et je ferai mon mieux vaut répondre.

Développer des modèles d’apprentissage profond pour la vision aujourd’hui!

Développez vos propres modèles de vision en quelques minutes

… avec juste quelques lignes de code python

Découvrez comment dans mon nouvel ebook:
Deep Learning pour la vision par ordinateur

Il fournit des tutoriels d’auto-apprentissage sur des sujets tels que: classification
, détection d’objets (yolo et rcnn), reconnaissance faciale (vggface et facenet) , préparation des données et bien plus encore …

Enfin, apportez le Deep Learning à vos projets Vision

Ignorez les universitaires. Juste des résultats.

Voir ce qu’il y a à l’intérieur

Tweet Partager Partager

Leave a Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *