Fabien Moutarde
Centre de Robotique (CAOR), Mines ParisTech
Démarrage
Commencez par consulter (dans un onglet séparé) et effectuer les instructions de la section "Démarrage" du mode d'emploi de l'outil "Janet".
Ensuite, faites les 4 exos ci-dessous qui ne consistent qu'à effectuer des apprentissages (sans passer trop de temps sur les 3 premiers, car le dernier est + intéressant)
et garder un peu de temps pour l'exo complémentaire
où vous pourrez regarder/modifier du code de l'algo
lui-même.
Canevas général de la première partie du TP
Le but de ce TP est de vous faire construire et entrainer des réseaux
de neurones correspondant à plusieurs problèmes d'apprentissage listés ci-après. Pour
chacun de ces problèmes, à traiter dans l'ordre
indiqué ci-dessous, lisez le petit descriptif du problème,
et ouvrez dans une fenêtre ou un onglet séparé(e)
le lien fourni, qui donne plus de détails sur la nature du pb et
la façon de le résoudre. Il est aussi nécessaire de conserver ouvert en permanence, dans un onglet ou une
fenêtre séparé(e), le mode d'emploi de l'outil d'apprentissage de réseau de neurones, afin d'effectuer au fil des problèmes du TP l'ensemble des manipulations mentionnées dans ce mode d'emploi. Enfin si vous effectuez ce TP dans le cadre de l'ES
"Apprentissage Artificiel", nous vous suggérons (comme pour tous
les TPs de cet ES), en vue de préparer le rapport sur le travail
effectué en TPs à remettre lors de l'examen, de noter au
fur et à mesure des informations sur ce que vous obtenez, ainsi
que vos réponses aux questions posées et vos propres
remarques/conclusions/interrogations (voire aussi des copies
d'écran pour illustration des résultats).
Essayer d'abord, pour se faire la main sur l'outil, le problème
d'apprentissage de la fonction booléenne XOR (base d'apprentissage
"xor.pat"), pour lequel on peut facilement "deviner" à l'avance
le nombre (faible) de neurones nécessaires et suffisant sur la couche
cachée ; toutefois, la présence de minima locaux peut parfois
nécessiter un réglage fin des paramètres.
Note : ne passez pas à la suite sans avoir réussi un
apprentissage AU MINIMUM sur les cas 1/, 2/ et 4/ (en particulier
le dernier concernant la reconnaissance de chiffres manuscrits).
Exercice complémentaire (pour ceux qui s'intéressent à l'implémentation de l'algo d'apprentissage)
Copiez puis dézipper l'archive custom-levisMLP.zip : celle-ci contient une librairie dans LevisMLP.jar, et dans MultiLayerPerceptronLearner.java le code source (A COMPLETER !) de l'algo d'apprentissage de réseau neuronal à couches.
L'archive contient aussi un répertoire avec une base d'exemples d'images de panneaux, que vous utiliserez pour tester
Commencer par démarrer le logiciel : dans un terminal, placez-vous dans le répertoire contenant LevisMLP.jar et fr/, puis passez la commande suivante : java -cp ".:./LevisMLP.jar" fr.ensmp.caor.levis.Levis
Dans l'interface, cliquez dans le champ de texte prévu
pour "Directory", puis allez sélectionner le répertoire DB_panneaux.
Cliquez ensuite dans le champ prévu pour "width", afin de
faire apparaitre la fenêtre d'aide au choix de redimensionnement
(à fermer une fois le choix de taille effectué)
Une fois la taille de redmensionnement choisie, cliquez sur le
bouton "Load", puis sur le bouton View pour vérifier
visuellement les versions redimensionnées des panneaux
Passez à l'onglet "MultilayerPerceptronLearner",
et choisissez une topologie (dimensions des couches) compatible avec la
base (nb d'entrées = width*height, nb de sorties = nb de
classes), puis cliquez sur le bouton Learn : pour le moment,
l'apprentissage stagne, car il vous faut compléter la
méthode qui effectue la modification des poids :
Ouvrez le fichierMultiLayerPerceptronLearner.java
La
méthode qui effectue l'opération de base de
l'apprentissage (une itération de descente de gradient pour un
exemple) est void backpropagation(MultilayerPerceptron model, double in[], double wantedOut[].
Il vous reste uniquement à y compléter le calcul de la
modification de poids à effectuer après que la
rétro-propagation a calculé les "delta" de tous les
neurones (voir les slides sur MLP pour retrouver la formule), en
prenant soin que le bytecode modifié MultiLayerPerceptronLearner.class
soit bien généré dans le sous-répertoire
fr/ensmp/caor/levis/learner du répertoire courant [NB: dans ce programme, la sortie du k+1 ième neurone de la i-ème couche se trouve dans model.out[i-1][k]]