Tensorflow 2.0 Tutoriel Python - Tensorflow tutorial

Tensorflow-Tutoriel-Python

TensorFlow est la librairie de référence quand l'on parle du Deep Learning.

Elle est Leader incontestable du domaine, devant Pytorch ou encore Vectorflow, la nouvelle née de Netflix.

C'est également incontestablement l'une des raisons pour lesquelles le développement de Theano, la bibliothèque de Deep Learning de l'Université de Montréal, a été arrêté (Yoshua Bengio : Theanomajor development would cease after the 1.0 release due to competing offerings by strong industrial players). 

Dans sa version 2.0, TensorFlow se montre plus simple que jamais et se veut dès lors accessible à tout un chacun.

Vous le verrez d'ailleurs dans ce tutoriel, si vous connaissiez déjà les précédentes versions de TensorFlow. 

Vous verrez à quel point manipuler TensorFlow est devenu simple. J'exagère peut être une peu en disant cela, mais je crois sincèrement que même un enfant de 5 ans qui connaît la programmation python, pourrais utiliser TensorFlow à l'heure actuelle tellement elle s'est simplifiée dans sa version 2.0.   

Dans cet article sur TensorFlow 2.0, nous verrons ensemble : 

Qu'elle est la méthode la plus simple et rapide pour installer TensorFlow. 

Les fonctions usuelles de TensorFlow (créer un Tensor, une couche de réseau neuronal, etc.....) 

Comment créer un perceptron multicouche avec TensorFlow 

Comment créer un réseau de neurones convolutifs avec TensorFlow

Comment créer un réseau de neurones récurrents avec TensorFlow

   


Installation de TensorFlow 2.0

Il y a de multiples manières d'installer TensorFlow.

Mais, la plus directe et la plus rapide reste encore de passer par la gestionnaire de paquet officiel de python "pip".     

De plus, il existe deux versions de TensorFlow, une qui n'utilise que le processeur et ses optimisations pour effectuer des calculs et une autre qui en plus d'utiliser les ressources processeur, utilise les ressources de la carte graphique pour aller plus vite.

Cette dernière présente l'avantage d'avoir  des speed up pouvant aller même au-delà de x100 suivant le type de GPU que tu utilises et selon bien entendu la taille du modèle que tu utilises. 

Un petit modèle ira bien plus vite sur le processeur que sur la carte graphique  et a contrario un modèle qui prend en entrée de grosses images avec beaucoup de mégas pixels tels que celle qu'on prend avec nos smartphones de nos jours sera littéralement intractable avec le processeur et nécessitera obligatoirement l'appui d'une carte graphique (et une bonne ! Pas comme la Geforce 940 MX sur le PC avec lequel je suis en train d'écrire ce tutoriel).

C'est plus une carte graphique du genre Quadro P5000, Tesla K80 ou encore GTX R2080 (si ça existe) qui permet de traiter ce type d'image.  

C'est pourquoi si tu as une carte graphique NVIDIA  (car bien sûr il fallait que Google boude AMD, du moins si tu connais une implémentation de TensorFlow pour carte graphique AMD, je te prierais de m'envoyer un mail juste histoire de m'en informer), je vous recommande d'installer la seconde version, celle qui prend en compte le GPU de l'ordinateur.

Mais bon, cela dit, on va voir comment installer les deux versions.

Bien entendu, j'espère que tu as python sur ton ordinateur, car sinon ça va être un peu compliqué sauf si tu veux le faire en C++, il te faudra alors suivre un autre tuto.      

La version sans GPU s'installe en tapant la ligne de commande suivante dans votre terminal : 

pip install tensorflow

Pour installer installer la version avec GPU, c’est la ligne suivante qu’il faudra taper :

pip install tensorflow-gpu

Mais avant de taper cette ligne dans le terminal, il vous faudra d’abord télécharger et installer les programmes suivant :

Pilotes pour GPU NVIDIA

CUDA Toolkit

cuDNN SDK 

TensorRT (Optionnel)

Afin d’installer les prérequis nécessaires à tensorflow pour pouvoir utiliser la carte graphique.

Les 5 étapes dans l'élaboration d'un modèle 

J'imagine  que la question qui te brûle les lèvres à cet instant même est comment construire un réseau de neurones c'est pour ça que l'on va directement rentrer dans le steak avec les 5 étapes à suivre pour construire un modèle avec TensorFlow ensuite nous enchaînerons avec la construction d'un perceptron multicouche et enfin nous finirons avec la construction d'un réseau de neurones convolutifs, le modèle particulièrement utilisé pour la classification d'image et qui à ce jour reste indétrônable dans quasiment toutes les compétitions de vision par ordinateur.

Voici les 5 étapes de construction d'un réseau de neurones :   


Maintenant que vous avez téléchargé TensorFlow, nous allons voir les 5 étapes basiques dans l'élaboration de tout modèle. 

1 Mise en place l'architecture du réseau ( en bref on dit combien de couches il a et de quel type est chacune des couches) 

2 Choix d'une méthode d'entraînement et compilation du modèle ( ici on choisit, l'algorithme d'entrainement et la métrique dévaluation du modèle)

3 Entraînement du modèle (je ne vois pas comment être plus clair que cela )

4 Évaluer le modèle (ici aussi)

5 Test du modèle  ( Prédiction sur une base d'exemples inconnus) 

Nous commençons dès à présent avec la mise en place de l'architecture du modèle.     

Mettre en place l'architecture du modèle 

Avec TensorFlow 2.0 vient l'inclusion de Keras dans le dépôt officiel de cette TensorFlow. C'est notamment la raison comme je l'ai dit plus haut pour laquelle même une enfant de 5 ans qui connaît le langage python (J'exagère peut-être un peu en disant ça) pourrait manipuler TensorFlow avec aisance. Tellement l'inclusion de Keras a simplifié les choses. C'est d'ailleurs la raison pour laquelle, nous nous en servirons dans toutes la suite, mais également la raison pour laquelle les développeurs de Google et de Keras recommandent l'abandon de Keras, mais également des anciens modules de TensorFlow permettant la création de Réseau de neurones au profit du module tensorflow.keras que j'appellerais tf.keras  dans la suite par souci de simplification.

Pour construire un réseau de neurones,il est nécessaire d'utiliser la classe sequential de tf.keras. Cette classe représentera en machine le réseau, c'est à cette dernière qu'on ajoutera des couches, mais qu'on entrainera et testera également. La création d'un modèle se fait comme suit :

# Importation de TensorFlow
import tensorflow as tf
#Création du modèle
model=tf.keras.Sequential()

Simple, Non?

Maintenant que nous avons construit le modèle, nous allons lui rajouter les couches.

Disclaimer : Dans cet article, je pars du point de vue que vous savez d'hors et déjà ce qu'est un réseau de neurones et qu'est-ce qu'une couche. Si ce n'est pas le cas, je vous invite à vous reporter à mon article sur les réseaux de neurones. Dès lors nous pouvons continuer plus en profondeur.

Pour ajouter une couche à un modèle, il faut utiliser le module layer de tf.keras et notamment les classes qui compose ce module. 

Il faut tout d'abord définir une couche d'entrée, c'est comme cela qu'il est possible de le faire :

layer=tf.keras.layers.Input(shape=[4], name='input')

Le constructeur de  layers.Input     prend principalement en paramètre la taille de la couche d'entrée. Ici l'on en mettant shape=[4]  , je déclare que l'entrée du réseau est un vecteur de caractéristique de dimension 4. Si j'avais voulu que ce soit une image en niveau de gris j'aurais plutôt mis shape=[256,256,1] pour indiquer une image de 256 px de hauteur et de 256 px de largeur et 1 canal qui signifie niveau de gris. Pour une image couleur en entrée par exemple ça aurait été shape=[256,256,1]   3 étant le nombre de canaux. 

Il faut ensuite se servir de la fonction add du modèle que l'on a créé précédemment pour ajouter cette couche 

#Ajout d'une couche d'entrée avec 4 entrée
model.add(layer)

Mais de manière général, la couche est créée puis directement passé au modèle. 

#Ajout d'une couche d'entrée avec 4 entrée
model.add(tf.keras.layers.Input(shape=[4], name='input_image'))


Pour les couches cachées, les choses se corsent un peu, car c'est nettement plus technique. À l'image des réseaux de neurones pour lesquels il y a différent type de couche, TensorFlow inclut différents types couches cachés.(Dense, Conv1D, Conv2D...). Je vais tout d'abord vous présenter la couche Dense qui est une couche de neurones pleinement connectée (tous les neurones de cette couche sont connectés à tous les neurones de la couche qui suit) typiquement utilisée dans la conception du perceptron multi-couche.     

Cela se fait en utilisant la classe tf.keras.layers.Dense

#Ajout d'une couche cachée de 18 neurones pleinement connecté
model.add(tf.keras.layers.Dense(18, activation='relu'))


Le constructeur de cette dernière prend principalement 2 paramètres, le premier est le nombre de neurones de la couche, le second est la fonction d'activation "relu". Il est possible de ne pas donner en paramètre la fonction d'activation, mais si c'est le cas TensorFlow utilisera par défaut la fonction d'activation linéaire a(x)=x comme il est précisé dans la documentation officielle.     

Pour finir, nous allons créer la couche de sortie. Typiquement ce sera une couche Dense si vous êtes dans un problème de classification, ou de régression. La fonction d'activation sera softmax si vous êtes dans le cas d'un problème  de classification, dans le cas d'un problème de régression, il est possible de ne pas la préciser et donc d'utiliser celle prévu par défaut (fonction linéaire).  

#Ajout d'une couche de sortie
model.add(tf.keras.layers.Dense(3, activation='softmax'))


Pour conclure, l'ensemble du code que nous avons implémenté jusqu'ici :



# Importation de TensorFlow 
import tensorflow as tf
#Création du modèle
model=tf.keras.Sequential()
#Ajout d'une couche d'entrée avec 4 entrée
model.add(tf.keras.layers.Input(shape=[4], name='input_image'))
#Ajout d'une couche cachée dense de 18 neurones
model.add(tf.keras.layers.Dense(18, activation='relu'))
#Ajout d'une couche de sortie
model.add(tf.keras.layers.Dense(3, activation='softmax'))


Afficher l'architecture du modèle avec summary

Une fois que vous avez fini de créer votre modèle, vous pouvez afficher son architecture en vous servant de la fonction summary. 

model.summary()

Exemple  :

# Importation de TensorFlow
import tensorflow as tf
#Création du modèle
model=tf.keras.Sequential()
#Ajout d'une couche d'entrée avec 4 entrée
model.add(tf.keras.layers.Input(shape=[4], name='input_image'))
#Ajout d'une couche cachée dense de 18 neurones
model.add(tf.keras.layers.Dense(18, activation='relu'))
#Ajout d'une couche de sortie
model.add(tf.keras.layers.Dense(3, activation='softmax'))
#Affichage de l'architecture du modèle
model.summary()


Résultat :

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense (Dense)                (None, 18)                90
_________________________________________________________________
dense_1 (Dense)              (None, 3)                 57
=================================================================
Total params: 147
Trainable params: 147
Non-trainable params: 0
_________________________________________________________________

Le résumé "summary" du modèle nous donne des informations sur le modèle, tels que le nombre de couche, le type de couche, le nombre de neurones par couche, la dimensions de chaque couche et le nombre de paramètres à entrainer.  Dans ce cas-ci, Nous pouvons constater que le modèle créer à 147 paramètres a entraîner.



Choisir un méthode d'optimisation et compiler le modèle 


Maintenant que l'architecture du modèle est créée, il ne reste plus qu'à définir comment ce dernier sera entraîné. Cela se fait à l'aide de la fonction compile. Pour compiler le modèle, trois paramètres doivent être fournis dans cette fonction, la méthode d'entraînement « optimizer », la métrique d'évaluation « metrics », et la fonction de coût  « loss ». De nombreux optimizer. Il n'est pas nécessaire de tous les connaître, les plus populaires son Stochastic gradient descent « sgd », adam, adagrad, rmsprop.

Exemple :

#Compilation du modèle 
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy',metrics=['accuracy'])


Metrics et loss function :

Selon le problème traité, la métrique et la fonction de coût utilisées seront amenées à variés.

Problème de classification binaire : 

fonction de coût : binary_crossentropy, métrique accuracy

Problème de classification :

fonction de coût : categorical_crossentropy, métrique accuracy

Problème de régréssion :

fonction de coût : mse (mean squarred error), métrique mae (mean average error),mse (mean squarred error)

Entrainer le modèle 

L'entraînement du modèle se fait en appelant la fonction fit.

model.fit(X_train, y_train, epochs=500)

Elle prend principalement pour paramètre les exemples d'apprentissage, leurs classes et le nombre d'époque. Nous allons tout de suite mettre en pratique tout ce que l'on a appris avec un exemple.


Évaluer  le modèle 

Le modèle est évalué en 2 temps, dans une premier temps, il est évaluer sur une base nommée base de validation c'est cette base qui s'assurera que le modèle n'a pas surappris. 


#Évaluation du réseau
loss, accuracy = model.evaluate(X_test,y_test)
print("Accuracy", accuracy)

Faire de la prédiction avec le modèle

Enfin pour prédire un ou des exemples, il faut utiliser la fonction prédict comme ci-dessous.

exemple = [6.3,2.8,5.1,1.5]
prediction = model.predict([exemple])

Constuire le plus simple des réseau de neurones : Le perceptron multi-couches


Dans cette deuxième partie, nous allons utiliser toutes les notions que l'on a vu dans la première partie afin de construire un réseau de neurones pour classer les fleurs du célèbre jeu de données Iris.  

Donc, je vais expliquer rapidement en quoi consiste le jeu de données Iris.csv.

Tu peut le télécharger via ce lien.

Il s'agit d'un jeu de données constitué à partir de mesures prélevées de fleurs appartenant à 3 espèces différentes (Iris Setosa, Iris versicolore et Iris Virginia).

Il est constitué au total de 150 exemples avec 50 exemples pour chaque espèce.

Les quatre mesures qui ont été prélevées sont : la longueur de sépale, la largeur de sépale, la longueur de pétale et la largeur de pétale.

Ci-dessous, tu peux voir un extrait de ce jeu de données 

Extrait du jeu de données :

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica

Charger en mémoire, le jeux de données Iris.csv

Pour charger en mémoire le jeu de données, il nous faudra utiliser la librairie python csv.

Il s'agit d'une librairie qui permet de lire, de modifier et d'écrire des fichiers csv simplement.

Elle est par défault installée avec python.

Dans un fichier csv, la dernière collonne indique généralement la classe et toutes les colonne avant indique les attributs.


from __future__ import absolute_import, division, print_function, unicode_literals
#Chargement du fichier iris.csv
import csv
iris_data=[]
iris_classe=[]
with open('iris.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
            iris_data.append([float(row[0]),float(row[1]),float(row[2]),float(row[3])])
            iris_classe.append(row[4])

Pour te simplifier le travail, je te recommande d'installer la bibliothèque scikit-learn. 

C'est une bibliothèque de machine learning qui te permettra d'utiliser des opérations simple mais importante du machine learning. 

Nous allons d'ailleur l'utiliser dans cette article. 

Ce qui en fait pour toi, une excellente occasion de l'installer. Pour ce faire, il te suffit d'utiliser "pip" comme l'on a fait précedemment pour tensorflow. 

En tapant dans ton invite de commande la commande suivante : 


pip install -U scikit-learn

Cela fait il te faudra importer les module sklearn que nous allons utiliser. 

Il s'agit de train_test_split qui permet de séparer un jeu de données en un jeux d'apprentissage et un jeu de test. 

Puis d'accuracy score qui permet d'évaluer le taux de bonne classification, en comparant les classe prédites et les classes réelles. 

Preprocessing, nous permettra comme son nom l'indique de prétraiter les données de sorte qu'elle soit utilisable par le perceptron multi-couches. 

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import preprocessing
import numpy as np
import tensorflow as tf


Dans un premier temps, les classe sont encodée. 

Si tu ne le sais pas encore il faut que tu sache qu'une réseau de neurones ne peut retourner d'entrée qui ne soit pas numérique, d'ou la nécessité d'encoder les classes . 

Les classe Iris-virginica,Iris-versicolor,Iris-setosa deviendront alors les classe 1,2 et 3 à la suite de cette opérations. 

De plus, la sortie d'un perceptron multi-couche est comprise entre 0 et 1. 

C'est pour quoi pour chaque classe, le percetron multi-couche aura une sortie qui indiquera un nombre entre 0 et 1 qui correspondra à la probabilité qu'un exemple appartienne à la classe concerné.

La classe 1 devient alors [1,0,0], 2 devient alors [0,1,0] et 3 devient alors [0,0,1].

#Encodage des classes afin qu'elles soit utilisable par le réseau de neurones
le = preprocessing.LabelEncoder()
#[Iris-virginica,Iris-versicolor,Iris-setosa]=>[1,2,3]
iris_classe=le.fit_transform(iris_classe)
#[1,2,3]=>[[1,0,0],[0,1,0],[0,0,1]]
iris_classe=tf.keras.utils.to_categorical(iris_classe,num_classes=3,dtype='float32')

Une fois les classe encodé, il est nécessaire de centrer réduire les données.

Mais avant cela, nous les séparons en une base d'apprentissage, et une base de test.


#Split de la base principale en une base d'app et de test
X_train, X_test, y_train, y_test = train_test_split( iris_data, iris_classe, test_size=0.33, random_state=42)

centrer-réduire les données est nécessaire pour le perceptron multi-couche car l'entraînement de celui-ci échoue lors ce que les données ne le sont pas.

Cela est probablement du au fait que le perceptron multi-couche accorde certainement plus d'importance au grande valeur qu'il reçoit en entrée lors de son entraînement.

Pour ce faire, nous allons utiliser la fonction standardscaler de sklearn.


#Opération centrer-réduire les données
scaler = preprocessing.StandardScaler().fit(X_train)
X_train=scaler.transform(X_train) 
X_test=scaler.transform(X_test) 

Une fois les classe encodées et les données centrée réduite, il nous est alors possible de construire le réseau de neurones.

Nous allons constuire un perceptron multi-cocuhes qui prendra en entrées les 4 mesures prélevée sur les fleurs, avec une couche cachée de 10 neurones et 3 sortie correspondantes aux trois espèces possibles.

Pour cela, on utilise le module Sequential de keras et bien sur des couche de neurones Dense qui je le rapelle correspondent au neurones pleinement connectés à la couche suivante.

Pour finir la fonction d'activation de la couche cachée sera la fonction relu, et celle de la dernière couche sera une softmax, fonction classiquement utilisée pour la résolution des problèmes de classification.


#Déclaration du réseau de neurones, 4 entrées, 1 couche cachée de 10 neurones, 3 sortie possibles
model = tf.keras.Sequential([
  tf.keras.layers.Dense(10, activation='relu', input_shape=(4,)),
  tf.keras.layers.Dense(3, activation='softmax')
])

Le modèle étant construit, il est compilé puis entraîné et enfin testé.


#Compilation du modèle
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
#Entrainement du réseau 
model.fit(X_train, y_train, batch_size=32, epochs=500)
#Évaluation du réseau
loss, accuracy = model.evaluate(X_test,y_test)
print("Accuracy", accuracy)
Après entraînement, Le résultat obtenu sur la base de test est le suivant :


Accuracy 0.98

98 % des fleurs dans le jeu de test ont été reconnues.

C'est à toi, d'identifier sur le taux de reconnaissance qu'obtient le réseau que tu as obtenu est suffisement bon pour l'application que tu cherche à en faire. 

Certaine fois un taux de 95% sera tout à fait excellent si l'application faite ne nécessite pas plus. 

Par contre si des vies humaines sont en jeu, comme par exemple dans le cas de la détection de cancer, on peut rapidement comprendre que 95 % n'est pas sufisant. 

Cela signifierais que 5% des cancer sont oublié et que par conséquent 5 personnes sur 100 en meure. 

Pour finir voici, le code complet : 



from __future__ import absolute_import, division, print_function, unicode_literals
#Chargement du fichier iris.csv
import csv
iris_data=[]
iris_classe=[]
with open('iris.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
            iris_data.append([float(row[0]),float(row[1]),float(row[2]),float(row[3])])
            iris_classe.append(row[4])
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import preprocessing
import numpy as np
import tensorflow as tf
#Encodage des classes afin qu'elles soit utilisable par le réseau de neurones
le = preprocessing.LabelEncoder()
#[Iris-virginica,Iris-versicolor,Iris-setosa]=>[1,2,3]
iris_classe=le.fit_transform(iris_classe)
#[1,2,3]=>[[1,0,0],[0,1,0],[0,0,1]]
iris_classe=tf.keras.utils.to_categorical(iris_classe,num_classes=3,dtype='float32')
#Split de la base principale en une base d'app et de test
X_train, X_test, y_train, y_test = train_test_split( iris_data, iris_classe, test_size=0.33, random_state=42)
#Opération centrer-réduire les données
scaler = preprocessing.StandardScaler().fit(X_train)
X_train=scaler.transform(X_train) 
X_test=scaler.transform(X_test) 
#Déclaration du réseau de neurones, 4 entrées, 1 couche cachée de 10 neurones, 3 sortie possibles
model = tf.keras.Sequential([
  tf.keras.layers.Dense(10, activation='relu', input_shape=(4,)),
  tf.keras.layers.Dense(3, activation='softmax')
])
#Compilation du modèle
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
#Entrainement du réseau 
model.fit(X_train, y_train, batch_size=32, epochs=500)
#Évaluation du réseau
loss, accuracy = model.evaluate(X_test,y_test)
print("Accuracy", accuracy)



Classifier des images avec TensorFlow



Dans cet seconde partie de l'article, nous allons voir comment implémenter un réseau convolutionnel de neurones en python avec TensorFlow. 

Si tu ne sais pas c'est quoi un réseau de neurones convolutionnel, je vais rapidement te l'expliquer.

Dans l'exemple que je t'ai montré précedemment, avec le jeu de données Iris.csv, nous avions quatre caratéristique qui permettait de discriminer les exemple de fleur. 

Il s'agit de la longeur de sépale, de la largeur de sépale, de la longueur de pétale, et de la largeur de pétale. 

Seulement, tu t'immagine bien que dans la réalité, on n'as pas toute ces mesures la toute cuite sur un plateau. 

Il faut soi :

Prendre la fleur et la mesurer manuellement avec une règle. Ce processus peut être particulièrement long surtout si il y a des millier de fleur à analyser. 

Prendre une photo de chaque fleur et construire une programme d'analyse d'image qui permettra de prélever ces quatre mesure. 

En clair il faut être expérimenter en traitement d'images. 

Cela n'arrange donc finalement que les expert en traitement d'images. 

Pour palier cela, en 1988 Yann Lecun au laboratoire Bell invente les réseaux de neurones convolutifs. 

La particularité de ces réseau est que contrairement au réseau classique tel que le perceptron multi-couche qui ont besoin des données prémaché pour pouvoir effectuer le job, 

Ces réseau n'ont juste besoin que de l'image brute. 

Ainsi, même quelqu'un n'y connaissant rien au traitement d'images, s'il a suffisement d'images des fleurs, il sera en mesure de construire un programme capeble de les discriminer, sans forcer comme normalement il devrait pour extraire les différentes mesures de fleurs.

Ci dessous tu peux voir le schéma d'un réseau de neurones convolutif.


Schéma du réseau convolutionnel de neurones :


Comme tu peux le voir, en entrée de ce réseaux comme je te lai dit précédemment, on y envoi une image. 

Cette image, va ensuite être modifiée plusieurs fois et donné naissance à différente images sous l'action des filtres du réseau de neurones.  

Chacune des images seront réduite à la suite d'une opération de pooling. Cette dernière, à pour but de résumer l'information se trouvant dans l'image.

Les deux étapes que je viens de citer sont nommer respectivement "convolution" et "pooling".

Elle sont répéter autant de fois que le concepteur du réseau le souhaite. 

En effet, pour le faire, ce dernier n'a juste qu'a ajouter au réseau une couche de convolution, à la suite de laquelle, il ajoutera une couche de pooling. 

De nouvelle images sont alors générée et la taille de celle-ci est alors réduites jusqu'a ce quelle soit écrasé par une couche flatten comme je le montrerais plus bas et envoyé en entrée d'un percetron multi-couches. 

Tu l'as donc probablement compris, le but de toute ces opération de convolution et de pooling est de prémacher le boulot, afin de pouvoir envoyé les informations extraites de l'image à un perceptron multi-couches. 

Exactement comme l'aurait fait un ingénieur en traitement d'images traditionnel, mise à part que cette fois ci c'est totalement automatique. 

Moins de boulot, moins de mal de tête donc. C'est tout bénèf. 

J'imagine que la maintenant il y a probablement un question qui doit te grater la tête, car tout ce que je te dis est bien beau mais pas forcément logique.

Cette étapes de convolution, comment fait telle pour savoir comme modifier les images envoyé en entrée pour finalement extraire les informations contenu dans l'image.

Alors moi je te réponds alors "Élémentaire mon cher Watson", 

Les filtre sont automatiquement déterminé grâce à l'algorithme de rétropropagation du gradient qui sert à entraîner le réseau.



En effet, ce réseau peut être utilisé pour traité tout type de signaux, ainsi certain seront utilisé pour la reconnaissance vocal.


Nous allons utilisé ce réseau de neurones pour reconnaître les caractères du jeu de données Mnist.  

Je t'explique donc brièvement MNIST :

Mnist est un jeu de données contenant des numéros (compris entre 0 et 9) écrit à la main. Sur l'image ci dessous tu peux voir un extrait de ce jeu de données. Le jeu de données est déjà séparé en une base d'apprentissage  qui contient 60 000 exemples et une base de test qui contient 10 000 exemples. 

 





#Fonction de chargement du fichier train.csv contenant les caractère de mnist
def load_dataset():
    a=0
    train_images=[]
    train_labels=[]
    test_images=[]
    test_labels=[]
    #Initialisation de random
    random.seed(30)
    #Ouverture et lecture de train.csv 
    with open('train.csv', 'r') as csvfile:
        myreader = csv.reader(csvfile, delimiter=',', quotechar='|')
        i=0
        for row in myreader:
            if i!=0:
                image_lbp=np.array(row[1:]).astype(np.float) 
                choix=random.randint(0,3)
                #Un exemple sur 3 va dans la base de test le reste dans la base d'apprentissage
                if choix==1 :
                    test_images.append(image_lbp)
                    test_labels.append(int(row[0]))
                else :
                    train_images.append(image_lbp)
                    train_labels.append(int(row[0]))                        
            i+=1
    return train_images,train_labels,test_images,test_labels


Comme je l'ai expliqué précedement, un réseau de neurones convolutionel n'est ni plus ni moins qu'une accumulation de couche de convolution et de pooling suivit d'un perceptron multi-couche. 

Pour représenté ce paradigme, 

TensorFlow a le type Conv2D qui permet de créer une couche de convolution.

Le constructeur de cette dernière prend en entrée, le nombre de filtre, la taille des filtres, et la fonction d'activation.

Exemple : 

layers.Conv2D(64, (3, 3), activation='relu')


Pour créer une couche de pooling, il faudra utiliser la classe MaxPooling2D qui prend en entrée le facteur par lequelle l'on souhaite divisé la taille des images obtenu dans la couche précédente. 


Exemple :


layers.MaxPooling2D((2, 2))


Pour finir, du fait que les couches soit bidimensionnelle, pour les envoyé en entrée du perceptron multicouche à la fin du réseau il va faloir les réduire à une dimension. 

Cela est possible en se servant de la couche flatten, qui réduit à une dimension tout ce qui la précède. 

layers.Flatten()

Le reste du réseau consite en généralement 2 ou 3 couche dense qui seront généralement 1 ou 2 couche caché et enfin une couche de sortie.




#Création du réseau de neurones
model = models.Sequential()
#Ajout d'une couche convolutionnel de taille 32 et de filtre 3 x 3 
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28,1)))
#Ajout d'une couche pooling 2 x 2
model.add(layers.MaxPooling2D((2, 2)))
#Ajout d'une couche convolutionnel de taille 64 et de filtre 3 x 3 
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
#Ajout d'une couche pooling 2 x 2
model.add(layers.MaxPooling2D((2, 2)))
#Ajout d'une couche convolutionnel de taille 32 et de filtre 3 x 3 
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
#Applatissement de la dernière couche pour l'envoyer en entrée d'une couche dense
model.add(layers.Flatten())
#Ajout d'une couche dense
model.add(layers.Dense(32, activation='relu'))
#Ajout d'une couche softmax
model.add(layers.Dense(10, activation='softmax'))



#Compilation du modèle, avec comme méthode d'entraînement adam (converge plus vite), et comme loss categorical_cross_entropy et comme métrique accuracy
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#Entrainement du modèle 
model.fit(train_images, train_labels, epochs=100, 
                    validation_data=(test_images, test_labels))
#Évaluation du modèle
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)



from __future__ import absolute_import, division, print_function, unicode_literals
#Importation des librairies nécessaires tensorflow, numpy, csv, os, scikit-learn,random
import tensorflow as tf
import numpy as np
import csv
import os
from tensorflow.keras import datasets, layers, models
from sklearn import preprocessing
import random
#Fonction de chargement du fichier train.csv contenant les caractère de mnist
def load_dataset():
    a=0
    train_images=[]
    train_labels=[]
    test_images=[]
    test_labels=[]
    #Initialisation de random
    random.seed(30)
    #Ouverture et lecture de train.csv 
    with open('train.csv', 'r') as csvfile:
        myreader = csv.reader(csvfile, delimiter=',', quotechar='|')
        i=0
        for row in myreader:
            if i!=0:
                image_lbp=np.array(row[1:]).astype(np.float) 
                choix=random.randint(0,3)
                #Un exemple sur 3 va dans la base de test le reste dans la base d'apprentissage
                if choix==1 :
                    test_images.append(image_lbp)
                    test_labels.append(int(row[0]))
                else :
                    train_images.append(image_lbp)
                    train_labels.append(int(row[0]))                        
            i+=1
    return train_images,train_labels,test_images,test_labels
train_images,train_labels,test_images,test_labels=load_dataset()
train_images = np.array(train_images)
#Mise en forme des données images de train et de test afin qu'elle soient comprises entre 0 et 1 
min_max_scaler = preprocessing.MinMaxScaler()
train_images = min_max_scaler.fit_transform(train_images)
test_images = min_max_scaler.transform(test_images)
train_images2=[]
test_images2=[]
#Transformation de la ligne du fichier CSV en une image de 28 x 28 pixels
for i in range (0,len (train_images)):
    train_images2.append(train_images[i].reshape(28,28,1))
for i in range (0,len (test_images)):
    test_images2.append(test_images[i].reshape(28,28,1))
train_images=[]
test_images=[]
#Conversion de toute les liste en tableau
train_images=np.array(train_images2)
test_images=np.array(test_images2)
test_labels=np.array(test_labels )
train_labels=np.array(train_labels )
#Création du réseau de neurones
model = models.Sequential()
#Ajout d'une couche convolutionnel de taille 32 et de filtre 3 x 3 
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28,1)))
#Ajout d'une couche pooling 2 x 2
model.add(layers.MaxPooling2D((2, 2)))
#Ajout d'une couche convolutionnel de taille 64 et de filtre 3 x 3 
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
#Ajout d'une couche pooling 2 x 2
model.add(layers.MaxPooling2D((2, 2)))
#Ajout d'une couche convolutionnel de taille 32 et de filtre 3 x 3 
model.add(layers.Conv2D(32, (3, 3), activation='relu'))
#Applatissement de la dernière couche pour l'envoyer en entrée d'une couche dense
model.add(layers.Flatten())
#Ajout d'une couche dense
model.add(layers.Dense(32, activation='relu'))
#Ajout d'une couche softmax
model.add(layers.Dense(10, activation='softmax'))
#Compilation du modèle, avec comme méthode d'entraînement adam (converge plus vite), et comme loss categorical_cross_entropy et comme métrique accuracy
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#Entrainement du modèle 
model.fit(train_images, train_labels, epochs=100, 
                    validation_data=(test_images, test_labels))
#Évaluation du modèle
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)


Classifier du Texte avec TensorFlow  


Source :

Install Tensorflow

GPU Support



.