Devoir 2013

Simulation des réseaux neuronaux

Généralités

Comme promis, votre devoir de cette année est consacré aux réseaux neuronaux. Il ne s'agit pas d'en bâtir un ab ovo ; il existent plusieurs frameworks permettant de réaliser un réseau et de faire quelques exercices avec des outils déjà définis. Je vous ai mentionné au moins deux en Java : Joone (assez simple ; n'évolue plus et pour l'instant on peut le considérer comme obsolète, même s'il marche et certains l'utilisent) et JavaNNS.

Si cela vous intéresse, vous trouverez plusieurs autres, mais principalement commerciaux (avec des essais gratuits), par ex. Peltarion Synapse, NeuroSolutions, Encog, etc. Ce dernier est très rapide, et sa populairité monte. Le progrès dans ce domaine est visible, il faut encore mentionner Neuroph qui utilise NetBeans comme le support d'interfaçage et débogage, avec plusieurs options visuelles.

Cette année j'ai décidé de vous faire marcher avec Python. Tout le monde doit le connaître (sinon, revisez, je vous aiderai, mais pas de pitié de ma part), et le développement et débogage des programmes grâce à l'interactivité est considérablement plus rapide qu'en Java. En Python les implémentations des simulateurs neuronique sont assez nombreuses. Voici quelques unes. Contrairement aux réalisations en Java, la construction du réseau typiquement n'est pas codable dans le style visuel ; ceci sera probablement un projet pour M1, pour l'année prochaîne.

Malheureusement, tous les paquetages ci-dessus ont des problèmes avec Python 3. Si vous trouvez sur le Web une version qui s'installe chez vous, vous avez, bien sûr, le droit de l'utiliser. Pour ceux qui n'arrivent pas, j'offre un simulateur-jouet écrit par Neil Schemenauer et modifié par James Howard (et converti pour Python 3.3 par JK). Utilise la méthode de retro-propagation et rien d'autre, pour l'instant...

Le paquetage nn.py contient deux tests : le notoire XOR, et une optimisation genre regression : adaptation d'une courbe (parabole) aux données. Lisez les afin de voir comment cela marche. Lisez un peu la documentation de PyBrain et de neurolab, afin de vous inspirer comment préparer les données pour l'apprentissage et les tests.

Puisque j'ai converti nn.py de manière à utiliser les tableaux du numpy, si cela ne vous convient pas, vous avez aussi l'original avec les listes (mais aussi adapté à Python 3).

Énoncé

Vous allez construire un réseau capable d'apprendre à reconnaître les chiffres décimaux écrits comme pixels sur une aire carrée (matrices de pixels [0,1], de taille 8 × 8). Algorithme : retropropagation.

Votre réseau devra avoir la couche d'entrée de 64 noeuds, les entrées seront soit 0 (blanc) soit 1 (noir ou couleur). Numériquement le chiffre 9 à droite correspond au tableau :

0 1 1 1 1 1 1 0
1 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1
0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 1
0 1 1 1 1 1 1 0
(Ceci peut être simplifié par le codage numérique, par ex.:
126, 129, 129, 129, 127, 1, 129, 126
mais il faudra le décoder pour alimenter les neurones).

Il est (probablement...) trop optimiste d'imaginer qu'un simple réseau puisse effectuer la reconnaissance raisonnable des 10 chiffres, donc –

le noyau à coder c'est un réseau avec une sortie binaire, capable de répondre lors du test à la question : est-ce LE chiffre utilisé pour l'apprentissage (9 et non pas 7 ou 4), oui ou non?

Le réseau de reconnaissance peut se transformer en réseau de classification, si la réponse "NON" déclenche la tentative de trouver un autre chiffre. Cela signifie que le processus serait très lent, mais la vitesse n'est pas notre problème.


Commentaires.

Modalités



Retour