Réseau de neurones et OCR

Fermé
xyouna Messages postés 2 Date d'inscription mercredi 15 novembre 2017 Statut Membre Dernière intervention 15 novembre 2017 - Modifié le 21 nov. 2017 à 09:59
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 - 21 nov. 2017 à 10:21
Pour une de mes matières, je dois programmer un réseau de neurones capable de reconnaître des caractère dactylographiés (OCR). Ils sont représentés en 5*5.
Je dois utiliser un réseau récurrent caractérisé par une interconnexion complète, des poids et des seuils réels, des connexions symétriques. Le réseau est initialisé à 0.5 pour les poids et 0 pour les seuils.
Pour l'apprentissage, l'activation des cellules est asynchrone.

Mon prof a donné le début du programme, que j'ai un peu modifié pour des soucis de compréhension.
Voici ce qu'il a écrit pour le début du programme :

point = "#"

N = 5 # nombre de lignes (et de colonnes) d'une forme

N_cell = N*N

# états des cellules du réseau (booléens)
etats = [0 for _ in range(N_cell) ]

# seuils des cellules du réseau (réels)
seuils = [ 0.0 for _ in range(N_cell) ]

# poids des connexions du réseau (réels)
poids = [ [ 0.5 for _ in range(N_cell)] for _ in range(N_cell) ]

exemple_a_reconnaitre = [ [True,  False, True,  False, True],
                          [True,  True,  False, False, True],
                          [False, False, True,  False, True],
                          [True,  False, False, True,  True],
                          [True, False, False, False, True] ]

alphabet = \
[ [ [False, True,  True,  True,  False],  # { A }
     [True,  False, False, False, True],
     [True,  True,  True,  True,  True],
     [True,  False, False, False, True],
     [True,  False, False, False, True] ],
   [ [True,  True,  True,  True,  False],  # { B }
     [True,  False, False, False, True],
     [True,  True,  True,  True,  False],
     [True,  False, False, False, True],
     [True,  True,  True,  True,  False] ],
   [ [False, True,  True,  True,  True],   # { C }
     [True,  False, False, False, False],
     [True,  False, False, False, False],
     [True,  False, False, False, False],
     [False, True,  True,  True,  True] ],
   [ [True,  True,  True,  True,  False],  # { D }
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  True,  True,  True,  False] ],
   [ [True,  True,  True,  True,  True],   # { E }
     [True,  False, False, False, False],
     [True,  True,  True,  False, False],
     [True,  False, False, False, False],
     [True,  True,  True,  True,  True] ],
   [ [True,  True,  True,  True,  True],   # { F }
     [True,  False, False, False, False],
     [True,  True,  True,  False, False],
     [True,  False, False, False, False],
     [True,  False, False, False, False] ],
   [ [True,  True,  True,  True,  True],   # { G }
     [True,  False, False, False, False],
     [True,  False, False, False, False],
     [True,  False, False, False, True],
     [True,  True,  True,  True,  True] ],
   [ [True,  False, False, False, True],   # { H }
     [True,  False, False, False, True],
     [True,  True,  True,  True,  True],
     [True,  False, False, False, True],
     [True,  False, False, False, True] ],
   [ [False, False, True,  False, False],  # { I }
     [False, False, True,  False, False],
     [False, False, True,  False, False],
     [False, False, True,  False, False],
     [False, False, True,  False, False] ],
   [ [False, False, True,  True,  True],   # { J }
     [False, False, False, True,  False],
     [False, False, False, True,  False],
     [False, False, False, True,  False],
     [True,  True,  True,  True,  False] ],
   [ [True,  False, False, False, True],   # { K }
     [True,  False, False, True,  False],
     [True,  True,  True,  False, False],
     [True,  False, False, True,  False],
     [True,  False, False, False, True] ],
   [ [True,  False, False, False, False],  # { L }
     [True,  False, False, False, False],
     [True,  False, False, False, False],
     [True,  False, False, False, False],
     [True,  True,  True,  True,  True] ],
   [ [True,  True,  False, True,  True],   # { N }
     [True,  False, True,  False, True],
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  False, False, False, True] ],
   [ [True,  False, False, False, True],   # { M }
     [True,  True,  False, False, True],
     [True,  False, True,  False, True],
     [True,  False, False, True,  True],
     [True,  False, False, False, True] ],
   [ [False, True,  True,  True,  False],  # { O }
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [False, True,  True,  True,  False] ],
   [ [True,  True,  True,  True,  False],  # { P }
     [True,  False, False, False, True],
     [True,  True,  True,  True,  False],
     [True,  False, False, False, False],
     [True,  False, False, False, False] ],
   [ [True,  True,  True,  True,  True],   # { Q }
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  False, False, True,  True],
     [True,  True,  True,  True,  True] ],
   [ [True,  True,  True,  True,  False],  # { R }
     [True,  False, False, False, True],
     [True,  True,  True,  True,  False],
     [True,  False, False, True,  False],
     [True,  False, False, False, True] ],
   [ [False, True,  True,  True,  True],   # { S }
     [True,  False, False, False, False],
     [False, True,  True,  True,  False],
     [False, False, False, False, True],
     [True,  True,  True,  True,  False] ],
   [ [True,  True,  True,  True,  True],   # { T }
     [False, False, True,  False, False],
     [False, False, True,  False, False],
     [False, False, True,  False, False],
     [False, False, True,  False, False] ],
   [ [True,  False, False, False, True],   # { U }
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [False, True,  True,  True,  False] ],
   [ [True,  False, False, False, True],   # { V }
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [False, True,  False, True,  False],
     [False, False, True,  False, False] ],
   [ [True,  False, False, False, True],   # { W }
     [True,  False, False, False, True],
     [True,  False, False, False, True],
     [True,  False, True,  False, True],
     [False, True,  False, True,  False] ],
   [ [True,  False, False, False, True],   # { X }
     [False, True,  False, True,  False],
     [False, False, True,  False, False],
     [False, True,  False, True,  False],
     [True,  False, False, False, True] ],
   [ [True,  False, False, False, True],   # { Y }
     [False, True,  False, True,  False],
     [False, False, True,  False, False],
     [False, False, True,  False, False],
     [False, False, True,  False, False] ],
   [ [True,  True,  True,  True,  True],   # { Z }
     [False, False, False, True,  False],
     [False, False, True,  False, False],
     [False, True,  False, False, False],
     [True,  True,  True,  True,  True] ] ]


def affiche_forme (forme) : 
 for i in range(N) :
   for j in range(N) :
     if forme[i][j] :
       print (point,end="")
     else :
       print (" ",end="")
   print ("\n")



Ca fait 2 semaines que je me prends la tête dessus et il y a tellement d'élèves perdus dans ma classe que je ne parviens JAMAIS à lui poser toutes les questions que j'ai. Il donne quelques indications en cours pour tout le monde, mais je ne sais pas si c'est lui qui ne se met pas à notre niveau ou juste nous qui sommes trop cons. C'est un peu mon dernier espoir ici.
Voici ce que j'ai écrit (j'ai modifié certains éléments de son programme) :

point = "#"

N = 5 # nombre de lignes (et de colonnes) d'une forme

N_cell = N*N

# états des cellules du réseau (booléens)
etats = [0 for _ in range(N_cell) ]

# seuils des cellules du réseau (réels)
seuils = [ 0.0 for _ in range(N_cell) ]

# poids des connexions du réseau (réels)
poids = [ [ 0.5 for _ in range(N_cell)] for _ in range(N_cell) ]

exemple_a_reconnaitre = [ [1, 0, 1, 0, 1],[1, 1, 0, 0, 1],[0, 0, 1, 0, 1], [1, 0, 0, 1, 1], [1, 0, 0, 0, 1]]

lettreA = [[0, 1, 1, 1, 0], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1]]

def affiche_forme (forme) : 
 for i in range(N) :
   for j in range(N) :
     if forme[i][j] :
       print (point,end="")
     else :
       print (" ",end="")
   print ("\n")


affiche_forme (lettreA)

 #_____________________________________________________________________________
 

affiche_forme (exemple_a_reconnaitre)

print (etats)

print (seuils)

print (poids)

ne = []
compteur = 0
if compteur < 24 :
    for i in range (25) :
        for j in range (25):
            ne += etats[i]*poids[i][j]
            compteur = compteur + 1
else :
    print ("voici la liste des nouveaux états",ne)


Mes questions :
- Est-ce que déjà je pars sur la bonne piste ? J'avais pensé à partir sur une boucle
while
mais je ne sais pas comment l'écrire.
- Pourquoi ça ne fonctionne pas ici ?
- Quelles sont les différentes étapes pour arriver à reconnaître au moins une lettre ?

Si une âme charitable aurait l'extrême amabilité de m'aider dans ma détresse, j'en serais tellement reconnaissante.
A voir également:

2 réponses

yg_be Messages postés 22692 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 avril 2024 1 471
15 nov. 2017 à 22:37
bonsoir, es-tu certaine d'avoir choisi des études qui vont te permettre de progresser?
0
xyouna Messages postés 2 Date d'inscription mercredi 15 novembre 2017 Statut Membre Dernière intervention 15 novembre 2017
15 nov. 2017 à 22:54
C'est un cours obligatoire, je n'ai pas le choix. Merci de votre aide.
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 747
Modifié le 21 nov. 2017 à 10:24
Bonjour,

Prenons le message dans l'ordre.

Programme de l'énoncé

- On construit une liste de matrice, chaque matrice représentant une lettre de l'alphabet. Plus précisément, chaque matrice 5x5 correspond à une matrice de pixels, où
True
correspond à un pixel noir et
False
à un pixel blanc.
- La boucle finale permet d'afficher dans un terminal les matrices sous une forme plus visuelles (
'#'
pour les pixels noirs,
' '
pour les pixels blancs).

Digression

Par rapport à ta question "est-ce que nous sommes trop c***", non je ne pense pas. Si vous êtes pleins à vous poser des questions, c'est sans doute qu'en l'état, votre professeur n'a pas donné assez d'information.

Après, je ne sais pas si son but est de vous faire chercher sur Internet comment entraîner un réseau de neurones. Ce n'est pas quelque chose qui me choque, s'il vous a bien dit que vous auriez à chercher pour trouver. D'un point de vue pédagogique ça se tient, car l'informatique est un domaine où on passe son temps à chercher sur Internet "la bonne manière de faire" ou comment résoudre tel ou tel message d'erreur.

Précisions sur l'exercice

Par rapport à ce que tu as commencé à écrire :

- Tu n'as pas besoin de modifier le code de ton professeur. Il faut juste le compléter.

- Le but est d'entraîner un réseau de neurones M de sorte à ce que si tu lui passes une lettre en entrée il t'indique de laquelle il s'agit.

- Généralement un réseau de neurones consiste à partir d'un vecteur d'entrée X à sortir un vecteur de sortie Y obtenu en appliquant le réseau de neurones à X. Dans ton cas X, correspondrait un vecteur pour lequel chaque cellule correspond à un pixel. Le vecteur Y serait typiquement un vecteur de taille 26, où la i-ième cellule vaut 1 si c'est la ième lettre, 0 sinon (ou du moins, une valeur proche).

- Toute la difficulté, c'est entraîner le réseau de neuronne pour que f(X) = Y si f désigne ton réseau de neurones. Pour cela tu peux commencer par lire cet article sur les réseaux de neurones récurrents. Ensuite le but est de trouve sur Internet ou dans ton cours comment entraîner un tel réseau.

Par rapport à ce que tu as commencé à coder

Pour passer une matrice sous forme d'une ligne, tu peux écrire directement :

#!/usr/bin/env python3

def matrix_to_vector(matrix):
    return [value for row in matrix for value in row]

letter = [
    [False, True,  True,  True,  False],  # { A }
    [True,  False, False, False, True],
    [True,  True,  True,  True,  True],
    [True,  False, False, False, True],
    [True,  False, False, False, True]
]

x = matrix_to_vector(letter)
print(x)


Bonne chance
0