TP Machine Learning

lundi 19 octobre 2020
par  Emmanuel Adam
popularité : 3%

Réseaux de neurones et détection de lettres

Il s’agit dans ce TP de configurer et d’utiliser un réseau de neurones

  • capable d’apprendre les différentes représentations graphiques de lettres,
  • et par la suite, capable de proposer à quelles lettres correspond le dessin d’une lettre.
  • Les lettres sont codées dans sous forme de tableau de 8x8 entiers dans 0,1.
  • Elles sont stockées dans une table de hashage qui possède :
    • comme clé, le caractère de la lettre « A », ...
    • comme valeur, une liste de codage (tableaux de 64 entiers) représentant chacun un dessin différent de la lettre

— -

La partie graphique est fournie, elle permet le dessin des lettres, la sauvegarde de ces dessins dans un fichier et leurs récupérations (classe principale = AppliNeuralPhabet).

Cette partie graphique doit être liée à un réseau de neurones.
Vous utiliserez la librairie encoghttp://www.heatonresearch.com/encog/ en java.
Vous trouverez des documentations, tutoriaux sur ce site.

Cliquez ici pour la documentation officielle de Encog pour Java.

Dans l’ensemble des classes fournies, vous trouverez la classe TestEncog01 qui est un exemple issu de la documentation de Encog pour la réalisation d’un réseau apprenant le XOR.

Vous devrez principalement modifier la classe NeuralPhabet


Utilisation de l’appli :

  • Passer en mode édition de lettre
    • choisir le menu Lettres->Saisir les lettres
      • dessiner une lettre en colorant les carrés
      • cliquez sur la droite sur la lettre correspondante (un chiffre apparaît, il s’agit du nb de dessins différents saisis pour la lettre)
          • La lettre est en fait recopiée avec des décalages en x et y de façon à obtenir le plus de dessins possibles débutant à différents endroits de la grille (exemple, une lettre de largeur 4 et de hauteur 5 sera codée 4x3 = 12 fois)
  • Quitter le mode édition de lettre
    • choisir le menu Lettres->Stopper saisie des lettres
  • Sauvegarder les lettres dans un fichier :
    • Choisir Fichier->Sauver les Lettres
  • Récupérer les lettres d’un fichier :
    • Choisir Fichier->Charger les Lettres
  • Faire apprendre le réseau
    • Choisir Réseau->Apprendre
  • Utiliser le réseau
    • Choisir Réseau->Déduire
      • dessiner des lettres sur la grille, à chaque clic l’appli indique à côté de chaque lettre quelle est son niveau de reconnaissance.

Testez les différents modes de corrections d’erreurs, ainsi que les différentes fonctions d’activations.
Notez les résultats pour vos différents choix et indiquez quel est le meilleur choix..

Algorithmes génétiques : Pigeons voyageurs

Des pigeons voyageurs doivent relier les villes suivantes en un minimum de temps :

  • Valenciennes (V), St Saulve (St), Beuvrage (B), Raisme (R), Petite-Forêt (PF), Marly (M), Aulnoy-lez-Valenciennes (A) et Onnaing (O)

Voici le tableau des distances

Villes V St B R PF M A O
V 0 2,5 3 4,75 3,7 2,5 3 6,5
St 2,5 0 3,2 3,3 5,4 3,3 4,6 3,9
B 3 3,2 0 2 2,8 5,5 6 6,5
R 4,75 3,3 2 0 2,6 7,3 7,5 8,3
PF 3,7 5,4 2,8 2,6 0 6 5,7 9
M 2,5 3,3 5,5 7,3 6 0 1,75 6,2
A 3 4,6 6 7,5 5,7 1,75 0 8
O 6,5 3,9 6,5 8,3 9 6,2 8 0

Voici la table des temps entre les villes :

Villes V St B R PF M A O
V 0 5 3 10 7 5 6 10
St 5 0 6 6 11 6.6 9 4
B 3 6 0 2 5 11 12 12
R 10 6 2 0 5 15 15 16
PF 7 11 5 5 0 12 11 13
M 5 6.6 11 15 12 0 3.5 5
A 6 9 12 15 11 3.5 0 10
O 10 4 12 16 13 5 10 0

100 pigeons sont lancés, ils choisissent leurs départs et leurs routes aléatoirement.

A chaque retour dans les pigeonniers des villes d’où ils sont partis, le kilométrage est effectué (les pigeons sont badgés par RFID, à chaque passage dans un pigeonnier, un tag est enregistré dans la puce).

Le score du pigeon i est :
score(i) = COEF_TPS x scoreTps(i) / maxScoreTps + COEF_DIST x scoreDist(i) / maxScoreDist
avec :

    • COEF_TPS + COEF_DIST = 1
    • scoreTps(i) le temps pris pour effectuer le chemin (i)
    • maxScoreTps le temps du plus long entre 2 villes
    • scoreDist(i) la valeur de la distance du chemin (i)
    • maxScoreTps la distance la plus grande entre deux villes

Un pourcentage des meilleurs (ayant parcouru le moins de km pour faire une boucle) sont choisis pour reproduction...

  • 1 accouplement entre pigeon A et pigeonne B donne naissance à 2 pigeons AB et BA
    • ce qui suppose que les pigeons sont hermaphrodites (deux pigeons ensembles s’accouplent obligatoirement)
    • et que la durée accouplement+gestation+croissance jusqu’à l’âge adulte est nulle..

Les autres pigeons restent en course..

Il s’agit donc de simuler ce principe par algo génétique en utilisant la librairie Encog.
Reprenez le code ci-dessous, SolvePigeon contient le code principal, Ville décrit les villes utilisées, ainsi que le tableau de distance et de temps, PigeonScore permet de retourner le score de la solution trouvée par un pigeon.

Algorithmes génétiques : Balistique

En prenant exemple sur l’exercice précédent,
programmez un algo génétique permettant de résoudre un pb de balistique.

Il s’agit ici de lancer un objet à un être aimé en cachette.

  • Il faut passer au dessus d’un balcon de 3m de haut, situé à 3m de distance, puis dans l’entrebâillement de la fenêtre, une ouverture située à 2,5m de hauteur et à 5m de distance de la position de lancer.

La hauteur maximale de lancer est de 2m, le poids maximum est de 1kg, l’angle doit être entre 0 et Pi/2 et la vitesse initiale ne peut dépasser 10m/s.

Une séquence ne sera donc composé que de 4 gènes :
la hauteur, la vitesse initiale(v0), l’angle, le poids.

La formule utilisée pour calculer la hauteur de l’objet lancé en fonction de la distance est :
$f(x) = \frac{-9.8}{2 \times v_0^2 \times poids} \times (1 + tan(angle)^2) \times x^2 + tan(angle) \times x + hauteur$

L’utilité d’une séquence se calcule par rapport à sa distance aux points visés :
$u(x) = 1 - ( \| f(3)-3\| + \| f(5)-2.5\| )$

La mutation d’un gène consiste à faire varier sa valeur de +- 10%.

Si $sequence^1 = [h^1, v_0^1, a^1, p^1]$
se croise avec $sequence^2 = [h^2, v_0^2, a^2, p^2]$
Alors cela donne naissance à 4 séquences :

  • $sequence^{12}_1 = [h^2, v_0^1, a^1, p^1]$
  • $sequence^{12}_2 = [h^1, v_0^2, a^1, p^1]$
  • $sequence^{12}_3 = [h^1, v_0^1, a^2, p^1]$
  • $sequence^{12}_4 = [h^1, v_0^1, a^1, p^2]$

Un exemple de solution :
en créant 50 séquences, et en les faisant se croiser 1000 fois, une solution obtenu est :

lancement d'un objet de 0,664 kg, à partir d'une hauteur de 1,678m,  sur un angle de 40,616 degres et en partant avec une vitesse de 9,602 m/s
hauteur de la balle à 3.0m = 3.0017666967134398, hauteur visée = 3.0
hauteur de la balle à 5.0m = 2.496031453116332, hauteur visée = 2.5

Documents joints

GuiAlphaBetTP
sources à compléter pour le TP du réseau de neurones pour la détection de caractères
librairie OpenCSV
version 3.9 of OpenCSV, see http://opencsv.sourceforge.net
base du TP sur l'algo genetique par encog
3 classes à compléter pour la résolution du pb de voyageur de commerce : Ville, PigeonScore et (...)