TP CNN
TP CNN
TP CNN
Introduction
Le but de ce TP est de proposer une introduction aux CNN. À la fin du TP vous serez
capables de mieux comprendre les concepts de base des CNN. Vous allez manipuler des réseau.
Vous verrez comment un réseau est entraîné de manière supervisée. Cet entraînement se fera sur
un réseau de taille modeste. Vous pourrez analyser la qualité des résultats obtenus.
Ensuite, vous utiliserez un réseau de grande taille (VGG16) pour effectuer des tâches différente
de celle pour laquelle il a été entraîné. Vous générerez des images de type "deep dream". Le but
de cette partie est de vous familiariser avec l’utilisation détournée de réseau de grande taille.
Dans ce TP nous n’abordons pas des questions fondamentales telles que le choix de l’archi-
tecture du réseau, le choix de la méthode d’apprentissage. Le but, est de vous donner les outils
pour que vous puissiez par la suite comprendre les articles de recherche qui utilisent les CNN et
avoir une idée précise de leur applicabilité pour la tâche que vous souhaitez accomplir.
Pour gagner du temps et de l’espace disque, vous allez utiliser mon installation de tensor-
flow 1 . Pour cela, si vous possédez déjà un répertoire ".conda" il faut changer son nom et créer un
lien symbolique vers mon ".conda". Exécutez les commandes suivantes dans une nouvelle fenêtre
de terminal (la première seulement si vous avez déjà un ".conda" 2 ) :
Ce qui précède ne doit être fait qu’une seule fois. Appelez l’encadrant au moindre problème
d’ordre informatique.
export PATH=/cal/softs/anaconda/anaconda3/bin:$PATH
cd TP_CNN/exercices
source activate tf_env
spyder
1. Les instructions sont valables si vous êtes sur des machines de la DSI
2. Dans ce cas pour revenir à votre installation originale il faut faire : cd ; rm .conda ; mv .conda_bak .conda
IMA208 - TP CNN: Introduction aux réseaux convolutionnels 2
Ce TP est centré sur l’analyse de programmes déjà écrits. Vous travaillerez sous spyder
essentiellement en sélectionnant une zone de programme et par clique-droit -> exécuter la cellule.
Cela permet une souplesse d’utilisation et de comprendre le code à mesure que l’on progresse
dans le TP.
MNIST est une base de données d’imagettes de chiffres manuscrits. Elle contient beaucoup
d’exemples annotés, le but est de construire un CNN capable des les reconnaitre.
Cette partie nous regardons le programme mnist_deep.py qui se trouve dans le répertoire
mnist. Ouvrez-le dans spyder sans l’exécuter. Ce programme commence par inclure (import)
des modules dont le plus important est tensorflow qui sera dénommé tf. Cela signifie que toute
fonction dont le nom commence par tf. vient du module tensorflow. Exécutez cette partie pour
avoir tensorflow disponible.
Dans tensorflow il y a des variables, des constantes et des operations. Une variable (ou une
constante) est un tableau de nombres qui peuvent varier (pas pour les constantes). Une opération
produit un résultat qui est un tableau de nombres. Une opération combine des opérations ou des
varaiables/constantes (et produira le résultat). Tout cela produit un graph de calcul.
Des variables spéciales appelées placeholder servent à communiquer des valeurs concrètes
pour les insérer dans le graphe de calcul (typiquement des données (images, signaux))
Aucun calcul n’est effectué à moins d’utiliser sess.run ou v.eval. où sess est une session
tensorflow et v une variable tensorflow. Ces deux méthodes prennent en entrée un dictionnaire
qui définit les valeurs concrètes des placeholder (ceux qui sont nécessaires aux calculs demandés 3 .)
Un grand intérêt de tensorflow (comme d ?autres systèmes de réseaux de neurones) est qu’il
est capable de calculer des gradients. Ainsi, si on déclare qu’un noeud du graph est la fonction de
coût, il suffit de calculer son gradient par rapport aux variables filtres pour faire évoluer ceux-ci
vers des valeurs permettant au réseau d ?effectuer la tâche à laquelle il est destiné.
Vous allez exécuter la suite du fichier en vous arrêtant avant la boucle d’apprentissage. Il est
important de lire les lignes que vous exécutez pour comprendre le fonctionnement. N’hésitez pas
à utiliser la commande python help, par exemple help(tf.nn.conv2d).
1.1 Apprentissage
Évaluez la réussite de votre réseau sur les données de test. Choisissez une image particulière
et affichez les différentes réponses des filtres par la fonction fournie.
Exercice Trouver le taux de réussite top-3, c’est-à dire le pourcentage d’images de test pour
lesquels la bonne classe est renvoyée parmi les trois premières réponses du CNN (la variable
probs continent les probabilités de chaque classe d’après le réseau).
2 Deep Dreem
Le but de cette partie est de manipuler un réseau déjà entrainé (et de grande taille) pour
créer des images "hallucinées". La base de la méthode utilisée est de partir d’une image aléatoire
et de la faire évoluer par montée de gradient pour augmenter un certain loss. Le loss sera la
réponse à une couche de réseau.
Vous lancerez les différentes parties de ce programme et répondrez aux questions suivantes
1. Écrire la loss qui optimisée par la ligne
render_naive(layer[:,:,:,channel])
3 Exemples adverses
Dans cette partie on utilise le programme trompe_vgg16.py. Il illustre une propriété très
étrange des classifieurs basés sur des CNN.
Exercice : Reprendre votre programme mnist. Après avoir rechargé le réseau mnist entrainé,
trompez votre réseau de la même manière pour transformer une chiffre bien classifé en un chiffre
mal classifié.