Le Deep Learning avec TensorFlow
Objectif du chapitre
Le chapitre précédent nous a permis d’aborder les concepts de base des réseaux de neurones. L’objectif de ce chapitre est double. D’une part, il va nous permettre d’aller un peu plus loin dans les concepts des réseaux de neurones tels que les réseaux de neurones à convolution ou le Transfer Learning, et d’autre part, il va nous permettre d’aborder la bibliothèque TensorFlow, qui est sans doute l’une des bibliothèques les plus utilisées pour implémenter les concepts sous-jacents des réseaux de neurones. Bien sûr, un seul chapitre ne va certainement pas être suffisant pour couvrir le sujet de Deep Learning dans sa globalité ni pour aborder tous les détails techniques de la bibliothèque TensorFlow. Le but est évidemment d’évoquer les concepts les plus fondamentaux du Deep Learning et les techniques les plus couramment utilisées avec TensorFlow de sorte que le lecteur, à la suite de ce chapitre, pourra sans difficulté aller plus loin dans sa formation traitant de ces deux sujets.
À la fin de ce chapitre, le lecteur aura abordé :
-
une introduction aux concepts généraux du Deep Learning,
-
une introduction à la bibliothèque TensorFlow 2,
-
l’utilisation de Sequential API pour développer des réseaux...
Le Deep Learning : notions générales
Pendant longtemps, les chercheurs en réseaux de neurones ont cru qu’un réseau de neurones avec une couche d’entrée, une couche de sortie et une ou deux couches cachées suffirait à modéliser la plupart des phénomènes étudiés dans ce domaine. Mais avec la multiplicité et la fréquence croissante des sources de données, les tailles des bases d’apprentissage ont beaucoup augmenté ces dernières années, notamment lors de la dernière décennie. Avec ces données d’apprentissage plus importantes en matière de taille, les réseaux de neurones complexes composés de plusieurs couches cachées ont montré une efficacité telle qu’aujourd’hui, dans certains domaines, il est très difficile d’envisager de développer des modèles d’apprentissage automatique sans l’utilisation de ces réseaux de neurones multicouches. En effet, les réseaux de neurones constitués de plusieurs couches cachées sont devenus des champions jamais égalés dans des domaines tels que la reconnaissance d’objets dans des images et la reconnaissance vocale.
Traiter le sujet du Deep Learning dans sa globalité avec toutes les versions techniques possibles proposées dans la littérature est quasiment impossible. Rien que l’évocation des grandes lignes des principes de ce domaine nécessiterait tout un ouvrage dédié en plusieurs tomes ! Cependant, dans ce chapitre, nous allons mettre en pratique les principes les plus répandus en matière de Deep Learning via des exemples en utilisant TensorFlow.
Mais avant d’aborder les détails techniques d’implémentation des réseaux de neurones complexes, cette section nous permet de passer en revue certains des principes les plus élémentaires du Deep Learning.
Lorsque nous parlons de Deep Learning, ou de l’apprentissage profond, il s’agit bien de réseaux de neurones constitués d’une ou plusieurs couches d’entrée, d’une ou plusieurs couches de sortie et de deux ou plusieurs couches cachées.
La figure suivante illustre l’architecture d’un...
Introduction à TensorFlow
1. Installer TensorFlow
TensorFlow peut être installé en utilisant la commande pip install classique qui permet d’ajouter de nouvelles bibliothèques dans votre environnement de travail. Cependant, en procédant ainsi, vous risquez de vous retrouver avec un environnement dans lequel certaines des bibliothèques déjà installées seraient incompatibles avec la version de TensorFlow ainsi installée.
À notre connaissance, la méthode d’installation de TensorFlow la plus simple et la plus sûre est d’utiliser un environnement virtuel Python conjointement avec Anaconda. Les deux sous-sections suivantes montrent comment créer un environnement virtuel Python et comment y installer TensorFlow.
a. Créer un environnement virtuel
Lorsque nous développons nos projets avec Python, il est fortement recommandé d’utiliser les environnements virtuels.
En effet, imaginez que vous êtes en train de développer deux projets simultanément en utilisant la même machine et sans l’utilisation d’environnements virtuels. Dans ce cas, les différentes bibliothèques utilisées par les deux projets doivent être installées au niveau système de votre plateforme de développement. Le problème est que si l’un des deux projets a besoin d’utiliser une bibliothèque donnée dans une version incompatible avec les versions des bibliothèques déjà utilisées par l’autre projet, cela conduit inévitablement à un conflit entre les versions de ces bibliothèques utilisées par les deux projets.
Justement, les environnements virtuels permettent de pallier ce type de problème de compatibilité de versions entre les bibliothèques. Une fois qu’un environnement virtuel est créé, il sera utilisé comme environnement de travail pour les projets utilisant les mêmes versions de bibliothèques.
Ainsi, les bibliothèques nécessaires pour un projet donné seront installées dans un environnement virtuel et ces bibliothèques ne seront visibles que par les projets développés dans ce même environnement virtuel.
Nous recommandons vivement de créer un environnement...
Les réseaux de neurones avec Sequential API
Cette classe permet de définir un objet qui sera associé à un réseau de neurones dont les couches sont connectées les unes aux autres de manière linéaire en partant de la couche d’entrée jusqu’à la couche de sortie en passant par les couches cachées.
Chaque couche cachée d’un réseau de neurones de type models.Sequential reçoit ses entrées à partir des sorties de la couche située juste derrière elle, et les sorties de cette couche cachée seront connectées uniquement aux entrées de la couche située tout de suite devant elle.
Nous allons réaliser un exemple de réseau de neurones en utilisant Sequential API. Ce modèle de réseau de neurones que nous allons réaliser sera spécialisé dans la classification des images.
1. Charger les données
Pour les besoins de cet exemple, nous allons utiliser les données du dataset fashion_mnist. Ces données sont un ensemble d’images dont chacune représente un produit parmi dix produits différents. Une fois entraîné, le réseau de neurones de cet exemple a pour objectif de reconnaître le produit présent dans une image donnée parmi dix produits possibles.
Créez un nouveau notebook Jupyter, puis saisissez et exécutez le code suivant dans une nouvelle cellule ; vous pouvez également utiliser directement le notebook Sequential_classification.ipynb.
import tensorflow as tf
from tensorflow import keras
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
Ces instructions permettent de charger les différentes bibliothèques nécessaires à la réalisation de notre exemple.
Remarquez l’import de la bibliothèque Keras à partir de TensorFlow. En effet, Keras est la bibliothèque de haut niveau officielle de développement des réseaux de neurones avec TensorFlow et cela depuis la version 2 de TensorFlow.
Avant la version 2, pour utiliser Keras conjointement avec TensorFlow pour le développement de réseaux de neurones, il aurait fallu installer TensorFlow...
Utiliser Functional API
Functional API permet de développer des réseaux de neurones dont la structure est plus complexe que la structure des réseaux de neurones que nous pouvons développer avec Sequential API. Avec Functional API, les couches d’un réseau de neurones ne sont pas forcément empilées les unes derrière les autres de manière linéaire comme avec Sequential API.
Dans cette section, nous allons développer un réseau de neurones avec trois couches d’entrée, trois couches cachées et deux couches de sortie. Afin de diversifier nos exemples de réseaux de neurones développés avec TensorFlow, nous allons développer cette fois un réseau de neurones pour une régression linéaire. L’architecture du réseau de neurones que nous allons réaliser dans cet exemple correspond à l’architecture de la figure suivante :
Figure 14-34 : réseau de neurones avec trois couches d’entrée, trois couches cachées et deux couches de sortie
1. Un modèle Functional API avec plusieurs couches d’entrée
Pour les besoins de ce nouvel exemple, nous allons utiliser les données du dataset fetch_california_housing que nous allons importer de la bibliothèque Scikit-learn. Ce jeu de données concerne le prix d’appartements en Californie en fonction de certaines caractéristiques relatives à ces appartements. Nous n’allons pas entrer dans les détails de définition de ces données car ce qui nous intéresse est de montrer comment utiliser Functional API afin de réaliser l’architecture du réseau de neurones de la figure 14-34 ci-dessus.
Pour réaliser cet exemple, créez un nouveau notebook, puis suivez les étapes de code ci-après ; vous pouvez également utiliser directement le notebook Functional_Regression.ipynb.
Le code suivant permet de lire les données que nous allons utiliser à partir de fetch_california_housing.
import tensorflow as tf
from tensorflow import keras
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split ...
Opérations avancées sur les réseaux de neurones
1. Monitorer un réseau de neurones
a. Contrôler les critères d’arrêt avec les callbacks
Pour réaliser cet exemple, créez un nouveau notebook, puis suivez les étapes de code ci-après ; vous pouvez également utiliser directement le notebook Cifar10.ipynb.
Le code suivant commence par charger les images du dataset cifar10 à partir de keras.datasets. Ce jeu de données contient des images dont chacune correspond à un des objets définis dans la liste cifar10_class_names.
Pour montrer quelques fonctionnalités de tensorflow.keras intéressantes et couramment utilisées, nous allons développer un exemple dans lequel nous allons construire un réseau de neurones de classification d’images. Ce réseau de neurones, une fois entraîné, devrait classer une image donnée dans l’une des dix classes listées dans cifar10_class_names.
Après avoir chargé le jeu de données cifar10, ce code définit le réseau de neurones model avec deux couches cachées en utilisant Sequential API selon plus au moins les mêmes étapes que celles que nous avons suivies lorsque nous avons développé le réseau de neurones de classification des images de fashion_mnist.
import tensorflow as tf
from tensorflow import keras
import os
import pandas as pd
import numpy as np
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
cifar10_class_names = {
0:"Plane",
1:"Car",
2:"Bird",
3:"Cat",
4:"Deer",
5:"Dog",
6:"Frog",
7:"Horse",
8:"Boat",
9:"Truck",
}
cifar10 = keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train = x_train.astype("float32")
x_test = x_test.astype("float32")
x_train= x_train/255
x_test = x_test /255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test...
Aller plus loin avec le Deep Learning et TensorFlow
Évidemment, il y a encore tellement de choses à dire sur le Deep Learning et sur TensorFlow ! Cependant, comme ce livre n’est dédié à aucun de ces deux sujets, nous n’allons pas aller plus loin dans l’exploration de ce fabuleux et prometteur domaine qu’est le Deep Learning.
Cependant, pour aller plus loin dans l’exploration des concepts de Deep Learning et l’exploitation de la bibliothèque TensorFlow, le lecteur est encouragé à creuser les pistes suivantes :
-
Augmenter artificiellement la taille des données d’entraînement lorsque celles-ci ne sont pas suffisantes, comme dans notre dernier exemple.
-
La documentation officielle de TensorFlow que vous pouvez consulter sur le site suivant : https://www.tensorflow.org/.
-
Un site plein de tutoriels et de projets réalisés avec TensorFlow : https://github.com/jtoy/awesome-tensorflow
-
La page des différents datasets proposés avec TensorFlow : https://www.tensorflow.org/resources/models-datasets
-
Le site officiel de TensorBoard pour le monitoring des résultats de vos réseaux de neurones : https://www.tensorflow.org/tensorboard/get_started
Conclusion
Ce chapitre nous a permis d’aborder les concepts fondamentaux de Deep Learning en complément des concepts de base abordés lors du chapitre précédent sur les réseaux de neurones. Ainsi, entre autres, nous avons eu l’occasion de mettre en pratique certains des concepts de Deep Learning en nous appuyant sur la bibliothèque TensorFlow. En résumé, après avoir abordé les opérations élémentaires possibles avec TensorFlow, nous avons développé des exemples de réseaux de neurones divers et variés. Nous avons réalisé un réseau de neurones de classification, un réseau de neurones pour la régression linéaire, nous avons vu comment réutiliser des réseaux de neurones existants tels que le réseau de neurones VGG16. Nous avons mis en pratique un réseau de neurones avec des couches de convolution et un réseau de neurones utilisant le concept du Transfer Learning. Avec les concepts abordés dans ce chapitre, la lecture de la documentation officielle de TensorFlow devrait normalement être abordable pour aller plus loin dans l’aventure Deep Learning !