Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
ENSAM- RABAT
Génie biomédical
II. Objectif :
Ce TP est consacré à la reconnaissance des chiffres manuscrite de 0 à 9, soit dix catégories de
prédiction. C’est un problème de classification multi-classes (> 2).On souhaite avoir un modèle
qui prendra en entrée une image représentant un chiffre manuscrite et nous fournira en sortie le
chiffre présenté par cette image, on peut schématiser le processus comme suit :
Figure 1: Processus
1
Python : c’est le langage utilisé dans ce TP. C’est un langage de Scripting
interprétable.
Prétraitement :
Nous utilisons la base de données MNIST qui comporte les descriptions de chiffres manuscrits
en format 28 × 28, soit 784 pixels, et les étiquettes associées. La base contient en tout 60 000
exemples, c’est-à-dire 6000 exemples de chaque chiffre. Nous chargeons d’abord la base, puis
nous examinons l’un des exemples qu’elle contient.
La base de données téléchargée est divisée sur 2 ensembles de donnée « sets » :
o Train (d’entrainement) : Va servir à l’entrainement de notre modèle.
o Test (de test) : Va constituer un témoigne avec lequel on évalue notre modèle.
Afin de manipuler les images téléchargées, nous devons mettre à l’échelle toutes ces images en
divisant par le niveau maximal de pixel au niveau de gris « 255 ».
On change la représentation de ces images au format Array de numpy, puis on chan ge la
dimension des images pour ajouter un axe supplémentaire. (Keras ne supporte qu’une entrée
avec 4 dimensions)
Pour y faire ces étapes sont suivis :
1. On définit une variable avec le nombre total de classe 10 (des chiffres de 0 à 9).
2. On définit une deuxième variable des images d’entrée.
3. On télécharge la base de donnée depuis les datasets prédifinies de keras
datasets.mnist.load_data() et on la répartie de façon à ce que les deux tuples (x_train, y_train)
et (x_test, y_test) aient respectivement des images d’entrainement et leurs étiquettes « labels »
et les images de test de l’algorithmes et leurs étiquettes.
4. Une mise à l’échelle des images d’entrainement et des images de test tout en changeant leurs
types avec la méthode de numpy astype() tout en modifiant la dimension de nos images pour
qu’elles puissent être accepter par keras .
2
Figure 3: chargement de data et mise à echelle
5. Encodage à chaud (one hot encoding), c’est une étape importante puisque la plupart des
algorithmes en Deep Learning voire même de Machine Learning n’acceptent que des étiquettes
(labels) en représentation vectorielle afin de faciliter la prédiction et le traitement des données.
Cette représentation consiste à mettre 1 l’état actif et les autres 0.
Pour ce faire, nous allons utilisé la méthode to_categorical de la classe utils de keras, ou bien nous
pouvons même écrire notre propre fonction qui fera cet encodage one-hot-encoding
3
Figure 7:Visualisation
1. Une Couche d’entrée qui prend en dimension les images de taille 28x28x1, il est
indispensable pour keras d’avoir 3 dimensions. (Ligne x Colonne x Channel), dans ce cas
channel = 1 puisqu’on travaille sur des images de niveau de gris 2D.
2. Une Couche de convolution avec 32 filtres (kernel) avec 3x3 de taille et une fonction
d’activation nommée ReLu.
3. Une Couche de MaxPooling avec taille 2x2
4. Une Couche Flatten qui change le dimensionnement des tenseurs en vecteur à une seule
dimension pour faciliter la distribution finale des catégories.
5. Une couche Dropout de 50% qui permet de désactiver 50% de nœuds pour ne pas tomber sur
le sur-apprentissage. Cette couche peut être éliminée en premier coup et puis rajoutée pour
pallier au problème d’overfitting.
6. Une couche finale FC (Fully Connected) nommée dans Keras par Dense. Elle est utilisée
pour délivrer la sortie finale de notre modèle, en utilisant la fonction d’activation Softmax, la
sortie de cette couche aurait dix probabilités pour chaque catégorie. La catégorie qui présente
une probabilité maximale est bien le résultat de prédiction.
4
Figure 9:l’architecture en code du CNN Figure 8:description du model
5
Figure 11:Evaluation du model
Noter qu’on a toujours ce dilemme loss/accuracy, on a intérêt à ce que les pertes du modèle
soient minimes et son accuracy soit maximale. Là on arrive à détecter 99% des chiffres avec un
taux d’erreur de 2.56% donc presque la totalité des images ont été reconnaît, ceci est un bon
indice pour notre modèle. Pour observer l’état du modèle dans chacune de ses 15 étapes
d’entrainement (epochs), on se sert de la variable history pour tracer les différents attributs
associés :
- loss, accuracy : correspond aux données d’entrainement.
- val_accuracy, et val_loss : correspond aux données de validation (les 10%).
Le tracé de ces courbes pourrait vous donner une idée sur la performance de votre modèle,
et d’observer si il y a un overfitting (sur-apprentissage) ou underfitting (sous-apprentissage).
4. Prédiction sur de nouvelles données :
Pour cette étape, on utilise les images de test x_test:
Figure 13: liste des labels détectés lors de la prédiction des images de test
Prenant par exemple l’image d’indice 9 de la base de test : x_test[9] on dessine celle-ci pour
vérifier que le modèle à bien prédit qu’il s’agit du chiffre 9, on compare le résultat avec
y_pred[9]
6
Figure 14 :le résultat avec x_test[9]
Figure 15:le résultat avec y_pred[9]
l’image dessiné présente le même chiffre détecté en y_pred[9], donc le modèle a bien
détecté le chiffre.
V. Conclusion :
Dans ce Tp nous avons essayé de rapprocher les étapes de traitement et de
développement de modèles du Deep Learning. Nous avons utilisé 60 000 photos
d'entraînement divisées en 10 catégories (chiffres de 0 à 9) pour évaluer notre modèle, et nous
avons utilisé 10 000 images de test pour évaluer notre modèle. Nous avons mis en œuvre un
modèle de reconnaissance de chiffres manuscrits, nous avons obtenue un taux de précision de
99,11 % .