1. Livres & vidéos
  2. Le deep learning avec TensorFlow/Keras
  3. Programmation d'un réseau à convolution
Extrait - Le deep learning avec TensorFlow/Keras 42 programmes Python pour passer de la théorie à la pratique
Extraits du livre
Le deep learning avec TensorFlow/Keras 42 programmes Python pour passer de la théorie à la pratique Revenir à la page d'achat du livre

Programmation d'un réseau à convolution

Construction d’un modèle avec Keras

1. Continuité avec le perceptron multicouche

Nous avons vu, dans le chapitre précédent, qu’un réseau à convolution se composait d’une partie pour extraire les caractéristiques des images, suivie d’une étape de classification :

images/Ch06.1.1.png

Principe d’un réseau à convolution

La programmation avec Keras va reprendre la même structure de code que celle utilisée pour les perceptrons multicouches, en ajoutant la description des couches de convolution/pooling. Les classes disponibles dans le module keras.layers pour les représenter sont détaillées dans les sections suivantes.

Tant que les modèles restent séquentiels, nous continuons à employer la classe keras.Sequential. Nous verrons un peu plus loin comment procéder avec l’API fonctionnelle pour décrire des branches parallèles.

2. Couche de convolution

La classe keras.layers.Conv2D opère des convolutions spatiales sur les feature maps en entrée :

images/Ch06.1.2.png

Les deux syntaxes layers.Conv2D et layers.Convolution2D existent et font référence à la même classe, mais l’usage de Conv2D est à privilégier.

3. Couches de pooling

a. Pooling par moyenne

La classe keras.layers.AvgPool2D opère un pooling par calcul d’une moyenne par zone sur les feature maps en entrée :

images/Ch06.1.3.1a.png

Les deux syntaxes layers.AvgPool2D et layers.AveragePooling2D existent et font référence à la même classe, mais l’usage de AvgPool2D est à privilégier.

La classe keras.layers.GlobalAvgPool2D opère un pooling...

Programmation du réseau LeNet-5

1. Rappel de l’architecture du modèle

Le modèle LeNet-5 à programmer est le suivant :

images/Ch06.2.1.png

Description détaillée du réseau LeNet-5

L’apprentissage utilise la même base MNIST de chiffres manuscrits que celle utilisée dans le chapitre Programmation d’un perceptron multicouche. C’est pourquoi la dimension des images en entrée du modèle est de 28×28 pixels.

Ce modèle comporte une petite différence par rapport à celui décrit dans le chapitre précédent, dans lequel la taille des images est de 32×32 pixels. C’est pourquoi la première couche de convolution utilise l’option de padding afin de n’avoir aucune réduction spatiale. Ainsi, on retrouve des feature maps de dimension 28×28 comme précédemment.

2. Programme avec des explications détaillées

images/telechargement.png Ch06_2.2-MNIST_LeNet5-Apprentissage-v1.ipynb

La structure du programme est identique à celle du chapitre précédent. Les seules modifications concernent le bloc de description du modèle, dans lequel le réseau LeNet-5 est construit :

# Instanciation d'un modèle "Sequential" 
mon_reseau = keras.Sequential() 
 
# Couche d'entrée avec la taille des images 
mon_reseau.add(keras.layers.InputLayer(shape=(28,28,1))) 
 
# 1ère couche de convolution 
mon_reseau.add(keras.layers.Conv2D( 
        filters=6,           # 6 filtres de convolution 
        kernel_size=(5,5),   # noyau de convolution 5x5 
        strides=(1,1),       # décalage horizontal=1 / vertical=1 
        activation='relu',   # fonction d'activation=Relu 
        padding='same'))     # ajout d'un bord à l'image 
 
# 1ère couche de pooling (average) 
mon_reseau.add(keras.layers.AvgPool2D( 
        pool_size=(2,2),     #...

Expérimentation de modèles avec ImageNet

images/telechargement.png Ch06_3-ImageNet-ReconnaissanceImages.ipynb

1. Objectifs

Jusqu’à présent, nous avons uniquement expérimenté la base MNIST avec des images stockées dans des tableaux en mémoire. L’objectif est maintenant d’exploiter des jeux de données (datasets), archivés sur disque, avec des images de plus grande taille et en quantité plus importantes.

Pour débuter, cette section est consacrée à la classification de photos de la base ImageNet avec des modèles Keras déjà entraînés, tels que VGGNet ou Inception. Pour une description détaillée de ces réseaux et de la base, vous pouvez consulter le chapitre précédent.

2. Dataset ImageNet 1000

a. Téléchargement de la base d’images

Étant donné qu’aucun apprentissage ne sera réalisé dans cette section, il n’est pas nécessaire de disposer de la totalité de la base ImageNet (qui représente plus de 50 Go !). Une base réduite, nommée « ImageNet 1000 (mini) », à installer en local sur l’ordinateur, sera suffisante. Elle comporte des images d’apprentissage et de validation pour les 1 000 catégories, mais en nombres limités. 

images/etudecas.png « ImageNet 1000 » est disponible pour téléchargement sur le site kaggle.com à l’adresse https://www.kaggle.com/datasets/ifigotin/imagenetmini-1000 :
images/Ch06.3.2.1a.png

Page « ImageNet 1000 (mini) » disponible sur le site kaggle.com

Pour enregistrer les images de ce dataset, il suffit de télécharger sur l’ordinateur le fichier zip (3,92 Go) et de le décompresser à l’emplacement souhaité (chaque opération pourra prendre plusieurs dizaines de minutes).

L’accès au téléchargement nécessite de disposer d’un compte Kaggle (gratuit). Si vous n’en possédez pas, il faut en créer un, avec la possibilité de l’associer au compte Google utilisé pour Colab.

Voici le résultat d’une installation dans le répertoire C:\Datasets\imagenet-mini :

images/Ch06.3.2.1b.png

Base « imageNet-mini » installée en local...

Identification d’objets avec la webcam

images/telechargement.png Ch06_4-ImageNet-ReconnaissanceWebcam.ipynb

1. Utilisation de la webcam avec Colab

Pour terminer ce chapitre, nous proposons d’exploiter la fonction classer_image(), développée dans la section précédente, pour identifier des images acquises avec la webcam de l’ordinateur.

Bien entendu, cette application aura des limites, puisque par construction, elle ne répondra qu’avec des propositions parmi les 1 000 catégories d’ImageNet. Malgré cette contrainte, ce programme permet de se rendre compte de la puissance des réseaux à convolution pour la reconnaissance d’images, et parfois aussi de ses limites.

Pour trouver comment exploiter la webcam avec Colab, le plus simple est d’utiliser la fonction Extraits de code de la barre latérale. Cliquer sur l’icône <> (1) ouvre le volet Extraits de code, avec une zone de saisie pour filtrer les demandes. En renseignant « webcam », la proposition Camera Capture apparaît dans la partie grisée (3). Après un appui sur la commande Insérer (4) le code de la fonction take_photo() est transféré dans le notebook :

images/Ch06.4.1.1a.png

Commande Extraits de code pour utiliser la webcam

Cette fonction est développée en JavaScript ; les détails de son fonctionnement sortent du cadre de cet ouvrage.

Notre notebook intègre une fonction prendre_photo(), fortement inspirée de ce code. Elle gère une fenêtre pour afficher la webcam et retourne le contenu lorsque l’utilisateur appuie sur le bouton Capture. L’image est codée au format Data URL comme...

Conclusion

Dans ce chapitre nous avons développé la construction et l’exploitation de modèles à convolution avec la bibliothèque TensorFlow/Keras.

Il débute par l’examen détaillé des couches disponibles dans le module keras.layers pour coder les opérations d’extraction de caractéristiques. Les classes Conv2D, AvgPool2D, GlobalAvgPool2D, MaxPool2D, GlobalMaxPool2D, et Flatten ont successivement été décrites, avec leur fonction et leur syntaxe. La normalisation par lots (BatchNormalization) a également été abordée avec des précisions sur ses modes de calculs.

Ces connaissances ont ensuite été utilisées pour le codage du réseau LeNet-5. Le programme développé obtient de très bons résultats, avec un taux de bonnes classifications supérieur à 99 %, sur les images de validation de la base MNIST. Ces performances ont encore été améliorées avec l’utilisation du module Keras-Tuner. Grâce à l’ajout de nouvelles couches de convolution et de pooling, et à l’augmentation de la profondeur des filtres, le taux d’erreurs a été réduit à 0,5 %. L’intégration de ce réseau avec l’interface interactive, développée dans le chapitre...