Académique Documents
Professionnel Documents
Culture Documents
TP
Classification d'images par
Deeplearning.
Partie 1
Question 1
1.1 Expliquez les points communs et différences entre Keras, TensorFlow, PyTorch et
YOLO (Darknet)
Ces technologies sont toutes open source, et ont des objectifs différents. Là où Keras, TensorFlow et
PyTorch permettent de développer des applications d’apprentissage automatique et des réseaux de
neurones plus ou moins profonds pour de nombreux types de tâches comme de la génération de texte, de
la détection d’objets, de la classification d’images… YOLO est plus spécifiquement utilisé pour la détection
d’objets en temps réel. Darknet propose cependant d’autres types de tâches.
• Keras : Keras est une interface d'apprentissage en Python de haut niveau qui peut être utilisée avec
TensorFlow, Microsoft Cognitive Toolkit ou encore Theano. Elle offre une syntaxe simple et intuitive
pour créer des modèles d'apprentissage automatique.
• TensorFlow : C’est une bibliothèque d'apprentissage automatique complète qui offre un contrôle
total sur les modèles, allant des modèles classiques aux réseaux de neurones profonds.
• PyTorch : C’est une bibliothèque d'apprentissage automatique, à la manière de TensorFlow, qui elle
est basée sur des graphes dynamiques, ce qui facilite le débogage et le prototypage rapide.
• YOLO (Darknet) : C’est un framework spécialisé dans la détection d’objets en temps réel, qui est
reconnu pour sa rapidité et son efficacité dans ce domaine.
• TensorFlow : Comme dit précédemment, Tf est statique de base, mais offre la possibilité d’être
dynamique avec sa version 2.0.
• PyTorch : PyTorch est dynamique, permettant ainsi de pouvoir modifier et construire les graphes à
la volée.
• YOLO (Darknet) : Le modèle est statique, ne pouvant pas être modifié à la volée durant l’exécution
de celui-ci.
• TensorFlow : Python, C, certains langages sans rétrocompatibilité (C++, Go, Java, Swift, Javascript),
certains packages faits par des tiers (C#, Haskell, R, Julia, Scala, Rust, Ocaml, Crystal)
• PyTorch : Python
• YOLO (Darknet) : C
1.4 Comment est décrit le réseau de neurones (donner des exemples)
• Keras : Créer un réseau de neurones avec Keras est très simple, il suffit de créer nos différentes
couches, et de créer notre model à partir de ces couches. L’ensemble se fait dans le code de
manière normale.
• TensorFlow : Le plus facile reste d’utiliser Keras, mais si l’on veut n’utiliser que Tf, c’est tout de
même possible. Il faut alors définir les tenseurs pour les entrées et les poids, spécifier les
différentes opérations de calcul pour chacune des couches de notre réseau, définir notre loss
function et un optimiseur pour l’entrainement. Tout se fait dans le code.
• PyTorch : La création de réseau de neurones est un peu différente, même si elle garde le même
principe. On va créer notre model à partir de la class NeuralNetwork dans laquelle on va placer nos
différents paramètres. Ainsi, dans __init__, on définit nos couches, et dans forward(), on spécifie
comment les données se propagent dans le réseau. Il suffit d’appeler le modèle créé comme une
fonction avec nos données en paramètres.
• YOLO (Darknet) : Avec YOLO, on a un fichier .cfg qui spécifie l’architecture du réseau et donc qu’il
faut définir, contenant les couches, les filtres, les nombres de boîtes englobantes prédites. On utilise
aussi soit des poids pré-entrainés à télécharger, soit il faut les entrainer sur notre ensemble de
données. Après cela, la détection d’objets se fait à partir de la configuration définie.
Question 2
Prise en main de l’exemple suivant :
https://www.tensorflow.org/tutorials/keras/classification
2.4 Quelles sont les différentes couches généralement associées dans les réseaux de
neurones (faire d’abord une réponse rapide que vous compléterez jusqu’au dernier TP
au fur et à mesure …)
En général, on retrouvera :
• La couche d’entrée : Chaque neurone récupère une caractéristique ou une dimension des données
fournies à l’entrée. Il n’y a pas de calculs effectués, cette couche ne sert qu’à transmettre les
données aux couches suivantes
• La couche de sortie : C’est la couche qui sera responsable de fournir le résultat, celle-ci peut être
assez différente en fonction du résultat voulu. Pour une classification multi-classe comme dans
l’exemple, on a normalement un neurone par classe.
2.7 Quel type de modifications simplistes peut être faite sur le réseau et en
particulier sur les hypers paramètres.
On peut modifier certains éléments comme le nombre d’epochs ou le type d’optimizer, ou même le nombre
de neurones de notre première couche Dense, afin de faire varier certains éléments.
https://deeplylearning.fr/cours-theoriques-deep-learning/reglages-des-hyper-parametres/
On peut ainsi lister plusieurs types de configuration en modifiant les hypers paramètres et trouver ainsi la
configuration la mieux adaptée et la plus performante.
2.9 Quelle est la fonction d’activation associée au modèle, tester avec d’autres
fonctions d’activation. Quelles sont les performances obtenues.
La fonction d’activation reliée au model est ‘ReLU’.
3.1 Quelle est ce format ? On passera par un fichier bmp en 28x28 puis on rajoutera
au dossier sous google collab et on convertira directement pour l’usage dans predict
(quel est le code associé sous google collab)
Le format est un tableau rempli d’images sous la forme de tableau de 28 cases par 28 cases. On récupère
donc 10 images, que l’on convertit en BMP 28*28.
3.2 Déposer ces images sur le e-campus sous un format bmp 28X28 et déposer aussi
l’original trouvé sur internet.
Est ce fait ?
Oui
3.3 Tester vos images, on affichera l’image et le résultat sous google collab sous la
forme suivante :
import os
from PIL import Image, ImageOps
import numpy as np
plt.imshow(img, cmap=plt.cm.binary)
predicted_label = np.argmax(predictions_array)
color = 'blue'
plt.xlabel("{} {:2.0f}%".format(class_names[predicted_label],
100*np.max(predictions_array)),
color=color)
thisplot[predicted_label].set_color('blue')
num_rows = 5
num_cols = 2
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
plt.subplot(num_rows, 2*num_cols, 2*i+1)
plot_image_bis(i, predictions[i], images)
plt.subplot(num_rows, 2*num_cols, 2*i+2)
plot_value_array_bis(i, predictions[i])
plt.tight_layout()
plt.show()
Si rien ne marche essayer de comprendre pourquoi et trouver une solution pour valider votre processus en
partant d’une image du dataset.
Question 4
(Faire d’abord une réponse rapide que vous compléterez jusqu’au dernier TP au fur et à mesure ….)
4.2 Lesquels ?
On pourrait modifier notre model initial, en mettant des couches de convolution au lieu de commencer par
un Flatten. On pourrait ainsi se baser sur une architecture LeNet pour l’adapter à notre situation, et en
remplaçant par exemple sigmoid par nos ReLU. En fonction de nos performances, on peut repasser sur du
sigmoid ou non.