dimanche 1 juin 2014

TD 1



Premier TD du cours "Neural Computing". Ce TD a pour objectif de vous faire faire vos premiers pas avec cette nouvelle manière de programmer : entraîner des réseaux de neurones pour résoudre une tâche. Nous allons commencer par faire de la reconnaissance de caractères, pour finir le TD sur de la reconnaissance de cellules cancéreuses!





Partie 1
Nous allons tout d'abord faire des réseaux de neurones avec un logiciel programmé en langage processing, avec une interface graphique. Cela permettra de comprendre globalement la logique de l'approche neuronale. Ce langage est déjà installé dans les salles de TP. Pour le lancer (sous linux), tapez la commande : 
/opt/processing-1.5.1/processing 
Au démarrage il est possible qu'il vous demande un nom de répertoire de travail, indiquez le bureau. Ensuite , téléchargez l'archive "miniOCR.zip" attaché à cet article et désarchivez la sur le bureau . Vous devez alors voir un répertoire miniOCR. Dans la fenêtre Processing, suivez les menus File->SketchBook->miniOCR, un code s'affiche alors. Cliquez sur le logo "play" (un triangle), vous devez alors voir une fenêtre s'afficher avec un réseau de neurones. Si besoin, vous pouvez cliquer sur le carré pour arrêter le programme. Ce programme, dérivé de celui-ci, permet de faire de la classification de dessins, c'est à dire une version minimale d'OCR Voici comment il fonctionne :
  • Pour pouvoir s'en servir pour reconnaître des lettres ou des dessins il faut d'abord lui constituer une base d'exemples.
  • Pour commencer essayer de faire des exemples pour reconnaître un rond ou une croix. Vous allez donc donner une série d'exemple de dessin de rond et de croix, en spécifiant à chaque dessin quel neurone doit être activé en sortie. Par convention on va choisir que les ronds doivent activer le premier neurone de sortie, et les croix doivent activer le second neurone de sortie.
  • Vous dessinez à la souris dans la zone du bas de la fenêtre (click gauche pour dessiner, click droit pour effacer)
  • Une fois un dessin fait, vous cliquez sur le neurone de sortie (zone du haut) désiré pour ce type de dessin.
  • Appuyez sur la touche '+' pour passer à l'exemple suivant, et '-' pour revenir à l'exemple précédent. Voyez l'indicateur de numéro d'exemple (sample) pour savoir sur quel exemple vous êtes entrain d'éditer..
  • Une fois que vous avez suffisamment d'exemples (à partir de 5 exemples de chaque classe ça peut commencer à fonctionner), appuyez sur la touche 'T' (pour "train") pour entraîner le réseau sur ces exemples. Voyez alors une valeur d'erreur s'afficher en bas de la fenêtre, votre réseau est entraîné. Il se peut que vous ayez à appyer plusieurs fois (pour arriver à un niveau erreur raisonnable (<0.01))
  • Appuyez alors sur la touche 't' pour tester basculer du mode d'apprentissage à celui de test, vous voyez que le mot "Train" devient "Test", vous pouvez alors créez d'autres dessins (de la même manière qu'avant), sauf que maintenant c'est le réseau qui propose une valeur de sortie. Vous pouvez gérer plusieur dessins de test grâce au touches '+/-'. Pour revenir au mode d'apprentissage (pour compléter la base d'exemples), appuyez à nouveau sur la touche 't'.
  • Faites des essais jusqu'à ce que vous arriviez à faire fonctionner raisonnablement votre système de reconnaissance de ronds et de croix.
  • La zone du milieux correspond au neurones dit "caché" qui forment une représentation interne des données.
  • Une fois que cela fonctionne, passez en mode "Test", et demander à une autre personne dans la salle (autre que votre binôme) de tester votre réseau en dessinant quelques exemples de ronds et de croix. Est-ce que ça marche toujours aussi bien ? Pourquoi ? Comment pourrions nous régler ce problème ?
Maintenant que vous avez pris en main le logiciel et les principe de base, vous allez créez par vous même un système de reconnaissance de votre choix, avec au moins 3 catégories. Par exemple reconnaître, les chiffres 0,1,2, ou le lettres A,B,C... Pour cela puisqu'il vous faudra plus que deux catégories, vous devrez changer dans le code la valeur indiquant le nombre de neurones de sorties. C'est très simple il s'agit de la première ligne du code du premier fichier.
int output_nbr = 2; // nombre de sorties
Arrêtez le programme (bouton avec le logo "carré"), relancez le , et refaites vos dessins, ainsi que les apprentissages et les tests. Vous avez pu mettre en pratique les concepts théorique vus en cours. Vous devez être maintenant capable de répondre à ces questions, avant de passer à la suite du TD :
  • Qu'est ce qu'un réseau de neurones ? (informatiquement, mathématiquement)
  • Qu'est ce qu'une base d'apprentissage ? De quoi est-elle composée ?
  • Quelle est la différence entre l'entrainement et le test ?
  • Sous quelle forme doit-on mettre les informations du problème à résoudre en entré du réseau ?
  • Sous quelle forme doit-on faire formuler la réponse par le réseau ?
  • Qu'est ce que les "neurones cachés" ? À quoi servent-ils ?
Partie 2
Si vous avez les réponse aux questions précédentes vous êtes prêt pour passer à la suite. On va aborder le même type de tâche (de la classification) mais du coté "ingénieur", c'est à dire qu'on va programmer notre réseau de neurone grâce à une librairie, en langage C.
Le problème que va résoudre ce réseau est de faire la fonction logique XOR. C'est un exemple pédagogique. En pratique il n'y a aucun intérêt à faire réaliser cette tâche par un réseau de neurones. Cette tâche à l'avantage d'être simple et de ne nécessiter que peus d'exemples d'apprentissage
La librairie que nous allons utiliser FANN , est déjà installée dans les salles de TP. Pour commencer avec un exemple de base vous trouverez, presque tout, sur cette page.

La librairie est déjà installé dans les salles de TP, vous n'avez donc qu'à compiler. Pour compiler avec la librairie FANN, vous devez avoir les options suivantes :
gcc monProgramme.c -o monProgramme -lfann -lm -L/usr/local/lib
Une fois que vous aurez réussi à entraîner (et tester) un réseau sur la fonction XOR à 2 entrés, modifiez ces codes de manière a le faire avec un XOR à 3 entrés.
À l'issue de cet exercice vous aurez normalement compris ce qui est nécessaire pour construire un réseau, l'entraîner, et l'utiliser.

Partie 3
Nous allons nous attaquer maintenant à un problème beaucoup plus réaliste...En utilisant la libraire FANN, vous allez faire un programme qui détecte des cellules cancéreuse. Lisez  le contexte de l'étude ici  ainsi que la description des donnés. Vous trouverez les données d'apprentissage ici.Il vous faudra trouver comment transformer ces données de manières à ce qu'elles soient utilisable par un réseau de neurones. Voici les étapes que vous aurez à faire :
  • Transformer les données en un fichier compatible au format FANN, à la fois en terme de syntaxe mais aussi en terme de valeures numérique exploitable par le réseau de neurones. Soyez malin essayer de faire cela au plus simple, comprenez que cette étape n'a besoin d'être réalisé qu'une seule fois...
  • Modifiez le programme d'apprentissage pour qu'il ai le bon nombre d'entrées et de sorties.
  • Executez l'apprentissage...
  • Créez un programme de test qui va permettre d'utiliser le réseau ainsi entraîné. Il lira à nouveaux les données mais cette fois ci pour les utiliser dans le réseau pour produire le résultat de sortie.
  • Vérifier que les prédictions faites par votre réseau sont (globalement) correctes.
Avec cet exercice vous aurez mis en pratique la formalisation exigée par l'utilisation de réseaux de neurones pour résoudre des problèmes de classification. Attention cependant , en particulier pour les parties 2 et 3, les tests sont effectués sur les données d'apprentissage, ce qui est très mauvais.

Annexe(s) :