Site Overlay

L’apprentissage automatique, c’est amusant ! Partie 3 : Apprentissage profond et réseaux neuronaux convolutifs

Nous pouvons former ce type de réseau neuronal en quelques minutes sur un ordinateur portable moderne. Lorsqu’il sera terminé, nous aurons un réseau neuronal capable de reconnaître des images de « 8 « s avec une précision assez élevée. Bienvenue dans le monde de la reconnaissance d’image (de la fin des années 1980) !

Tunnel Vision

C’est vraiment génial que le simple fait d’alimenter des pixels dans un réseau neuronal ait réellement fonctionné pour construire une reconnaissance d’image ! L’apprentissage automatique est magique ! …n’est-ce pas ?

Et bien, bien sûr, ce n’est pas aussi simple.

Premièrement, la bonne nouvelle est que notre reconnaissant « 8 » fonctionne vraiment bien sur des images simples où la lettre est juste au milieu de l’image :

Mais maintenant la très mauvaise nouvelle :

Notre reconnaissant « 8 » ne fonctionne absolument pas lorsque la lettre n’est pas parfaitement centrée dans l’image. Le moindre changement de position ruine tout :

C’est parce que notre réseau n’a appris que le modèle d’un « 8 » parfaitement centré. Il n’a absolument aucune idée de ce qu’est un « 8 » décentré. Il connaît exactement un modèle et un seul.

Ce n’est pas très utile dans le monde réel. Les problèmes du monde réel ne sont jamais aussi propres et simples. Nous devons donc trouver comment faire fonctionner notre réseau neuronal dans les cas où le « 8 » n’est pas parfaitement centré.

Idée de la force brute n°1 : recherche avec une fenêtre coulissante

Nous avons déjà créé un très bon programme pour trouver un « 8 » centré dans une image. Et si nous scannions tout autour de l’image pour trouver des « 8 » possibles dans des sections plus petites, une section à la fois, jusqu’à ce que nous en trouvions un ?

Cette approche est appelée une fenêtre coulissante. C’est la solution de la force brute. Elle fonctionne bien dans certains cas limités, mais elle est vraiment inefficace. Vous devez vérifier la même image encore et encore à la recherche d’objets de tailles différentes. Nous pouvons faire mieux que cela !

Idée de la force brute n°2 : plus de données et un réseau neuronal profond

Lorsque nous avons formé notre réseau, nous ne lui avons montré que des « 8 » parfaitement centrés. Et si nous l’entraînions avec plus de données, y compris des « 8 « s dans toutes les positions et tailles différentes tout autour de l’image ?

Nous n’avons même pas besoin de collecter de nouvelles données d’entraînement. Nous pouvons simplement écrire un script pour générer de nouvelles images avec les « 8 « s dans toutes sortes de positions différentes dans l’image :

Nous avons créé des données d’entraînement synthétiques en créant différentes versions des images d’entraînement que nous avions déjà. C’est une technique très utile !

En utilisant cette technique, nous pouvons facilement créer une réserve infinie de données d’entraînement.

Plus de données rend le problème plus difficile à résoudre pour notre réseau neuronal, mais nous pouvons compenser cela en rendant notre réseau plus grand et donc capable d’apprendre des modèles plus compliqués.

Pour rendre le réseau plus grand, nous empilons simplement couche après couche de nœuds :

Nous appelons cela un « réseau neuronal profond » parce qu’il a plus de couches qu’un réseau neuronal traditionnel.

Cette idée existe depuis la fin des années 1960. Mais jusqu’à récemment, la formation d’un réseau neuronal de cette taille était tout simplement trop lente pour être utile. Mais une fois que nous avons compris comment utiliser des cartes graphiques 3d (qui ont été conçues pour faire des multiplications matricielles très rapidement) au lieu de processeurs informatiques normaux, travailler avec de grands réseaux neuronaux est soudainement devenu pratique. En fait, l’exacte même carte vidéo NVIDIA GeForce GTX 1080 que vous utilisez pour jouer à Overwatch peut être utilisée pour former des réseaux neuronaux incroyablement rapidement.

Mais même si nous pouvons rendre notre réseau neuronal vraiment grand et le former rapidement avec une carte graphique 3d, cela ne va toujours pas nous amener jusqu’à une solution. Nous devons être plus intelligents sur la façon dont nous traitons les images dans notre réseau neuronal.

Pensez-y. Cela n’a pas de sens d’entraîner un réseau à reconnaître un « 8 » en haut d’une image séparément de l’entraîner à reconnaître un « 8 » en bas d’une image comme si c’était deux objets totalement différents.

Il devrait y avoir un moyen de rendre le réseau neuronal assez intelligent pour savoir qu’un « 8 » n’importe où dans l’image est la même chose sans tout cet entraînement supplémentaire. Heureusement… il y en a un !

La solution est la convolution

En tant qu’humain, vous savez intuitivement que les images ont une hiérarchie ou une structure conceptuelle. Considérez cette image:

Gratuitous photo de mon fils

En tant qu’humain, vous reconnaissez instantanément la hiérarchie dans cette image :

  • Le sol est couvert d’herbe et de béton
  • Il y a un enfant
  • L’enfant est assis sur un cheval gonflable
  • Le cheval gonflable est au-dessus de l’herbe

Plus important encore, nous reconnaissons l’idée d’un enfant quelle que soit la surface sur laquelle il se trouve. Nous n’avons pas à réapprendre l’idée d’enfant pour chaque surface possible sur laquelle il pourrait apparaître.

Mais pour l’instant, notre réseau neuronal ne peut pas faire cela. Il pense qu’un « 8 » dans une partie différente de l’image est une chose entièrement différente. Il ne comprend pas que déplacer un objet dans l’image n’en fait pas quelque chose de différent. Cela signifie qu’il doit réapprendre l’identification de chaque objet dans toutes les positions possibles. Cela craint.

Nous devons donner à notre réseau neuronal la compréhension de l’invariance de la traduction – un « 8 » est un « 8 », peu importe où il apparaît dans l’image.

Nous allons le faire en utilisant un processus appelé Convolution. L’idée de la convolution est inspirée en partie par l’informatique et en partie par la biologie (c’est-à-dire des scientifiques fous qui fouillent littéralement le cerveau des chats avec des sondes bizarres pour comprendre comment les chats traitent les images).

Comment fonctionne la convolution

Au lieu d’introduire des images entières dans notre réseau neuronal sous la forme d’une seule grille de chiffres, nous allons faire quelque chose de beaucoup plus intelligent qui tire parti de l’idée qu’un objet est le même peu importe où il apparaît dans une image.

Voici comment cela va fonctionner, étape par étape –

Etape 1 : casser l’image en tuiles d’images qui se chevauchent

Similairement à notre recherche par fenêtre glissante ci-dessus, passons une fenêtre glissante sur toute l’image originale et enregistrons chaque résultat comme une minuscule tuile d’image séparée :

En faisant cela, nous avons transformé notre image originale en 77 minuscules tuiles d’image de taille égale.

Étape 2 : alimenter chaque tuile d’image dans un petit réseau neuronal

Auparavant, nous avons alimenté une seule image dans un réseau neuronal pour voir si c’était un « 8 ». Nous allons faire exactement la même chose ici, mais nous le ferons pour chaque tuile d’image individuelle :

Répétez ceci 77 fois, une fois pour chaque tuile.

Cependant, il y a un gros twist : nous allons garder les mêmes poids de réseau neuronal pour chaque carreau de la même image originale. En d’autres termes, nous traitons chaque carreau de l’image de la même manière. Si quelque chose d’intéressant apparaît dans une tuile donnée, nous marquerons cette tuile comme intéressante.

Étape 3 : Enregistrer les résultats de chaque tuile dans un nouveau tableau

Nous ne voulons pas perdre la trace de la disposition des tuiles originales. Donc, nous sauvegardons le résultat du traitement de chaque tuile dans une grille dans le même arrangement que l’image originale. Cela ressemble à ceci:

En d’autres termes, nous avons commencé avec une grande image et nous avons terminé avec un tableau légèrement plus petit qui enregistre les sections de notre image originale qui étaient les plus intéressantes.

Étape 4 : Déséchantillonnage

Le résultat de l’étape 3 était un tableau qui cartographie les parties de l’image originale les plus intéressantes. Mais ce tableau est encore assez grand :

Pour réduire la taille du tableau, nous le sous-échantillonnons en utilisant un algorithme appelé max pooling. Cela semble fantaisiste, mais ça ne l’est pas du tout!

Nous allons juste regarder chaque carré 2×2 du tableau et garder le plus grand nombre:

L’idée ici est que si nous avons trouvé quelque chose d’intéressant dans l’un des quatre carreaux d’entrée qui composent chaque carré de grille 2×2, nous allons juste garder le bit le plus intéressant. Cela réduit la taille de notre tableau tout en gardant les bits les plus importants.

Étape finale : Faire une prédiction

Jusqu’ici, nous avons réduit une image géante en un tableau assez petit.

Devinez quoi ? Ce tableau est juste un tas de nombres, donc nous pouvons utiliser ce petit tableau comme entrée dans un autre réseau neuronal. Ce dernier réseau neuronal décidera si l’image est ou non une correspondance. Pour le différencier de l’étape de convolution, nous l’appelons un réseau « entièrement connecté ».

Donc, du début à la fin, l’ensemble de notre pipeline en cinq étapes ressemble à ceci :

Ajouter encore plus d’étapes

Notre pipeline de traitement d’images est une série d’étapes : convolution, max-pooling, et enfin un réseau entièrement connecté.

Lorsque vous résolvez des problèmes dans le monde réel, ces étapes peuvent être combinées et empilées autant de fois que vous le souhaitez ! Vous pouvez avoir deux, trois ou même dix couches de convolution. Vous pouvez jeter dans max pooling où vous voulez pour réduire la taille de vos données.

L’idée de base est de commencer avec une grande image et de la réduire continuellement, étape par étape, jusqu’à ce que vous ayez finalement un seul résultat. Plus vous avez d’étapes de convolution, plus les caractéristiques compliquées que votre réseau sera capable d’apprendre à reconnaître.

Par exemple, la première étape de convolution pourrait apprendre à reconnaître les bords aigus, la deuxième étape de convolution pourrait reconnaître les becs en utilisant sa connaissance des bords aigus, la troisième étape pourrait reconnaître des oiseaux entiers en utilisant sa connaissance des becs, etc.

Voici à quoi ressemble un réseau convolutif profond plus réaliste (comme celui que vous trouveriez dans un article de recherche) :

Dans ce cas, ils commencent une image de 224 x 224 pixels, appliquent la convolution et le max pooling deux fois, appliquent la convolution 3 fois de plus, appliquent le max pooling et ont ensuite deux couches entièrement connectées. Le résultat final est que l’image est classée dans une des 1000 catégories!

Construire le bon réseau

Alors, comment savoir quelles étapes vous devez combiner pour que votre classificateur d’images fonctionne ?

Honnêtement, vous devez répondre à cette question en faisant beaucoup d’expérimentation et de tests. Vous devrez peut-être former 100 réseaux avant de trouver la structure et les paramètres optimaux pour le problème que vous résolvez. L’apprentissage automatique implique beaucoup d’essais et d’erreurs !

Construire notre classificateur d’oiseaux

Nous en savons enfin assez pour écrire un programme capable de décider si une image est un oiseau ou non.

Comme toujours, nous avons besoin de données pour commencer. Le jeu de données gratuit CIFAR10 contient 6 000 images d’oiseaux et 52 000 images de choses qui ne sont pas des oiseaux. Mais pour obtenir encore plus de données, nous allons également ajouter l’ensemble de données Caltech-UCSD Birds-200-2011 qui contient 12 000 photos d’oiseaux supplémentaires.

Voici quelques-uns des oiseaux de notre ensemble de données combiné :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.