Programmer un réseau de neurones

Résolu/Fermé
xavier - 16 oct. 2004 à 20:05
 SETH - 29 oct. 2010 à 06:11
Bonjour à tous,

Je me suis mis dans l'idée de programmer un réseau de neurones, le problème étant que je ne sais pas par quel bout commencer.

En fait je ne parviens pas à trouver comment programmer une fonction réorganisation du réseau lors d'un apprentissage qui ne foutte pas en l'air tous les apprentissages précédents...
je sais aussi que le mieux pour moi, pour comprendre et apprendre, est d'examiner un programme déjà existant. Disons que j'ai quelques lacunes en matière de création, d'invention...

Qulequ'un a-t-il déjà programmer un tel réseau ? Si oui peut-il me le montrer en exemple ? Connaissez vous des liens de pages mettant en ligne des codes de réseaux ?

Merci de vos réponses.

Xavier.
A voir également:

88 réponses

franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
30 déc. 2004 à 21:51
OK, ben c'est très bien, de bons résultats comme ça !

Juste une remarque :
non, ça ne va pas être facile d'augmenter arbitrairement la taille de la grille d'entrée !
La raison est très simple, c'est que si on te dit d'écrire le chiffre 5 sur une feuille A4, tu vas pouvoir l'écrire petit, grand, à gauche, à droite, etc.
Les réseaux à couches sont très démunis dans ce cas-là !
Et augmenter le nombre de neurones de la couche d'entrée est sans doutes la pire chose à faire : chaque neurone vas se trouver très isolé, et si ton réseau est habitué à voir un chiffre en haut à gauche, il ne reconnaitra rien si le même chiffre se trouve en bas à droite.

En plus, ça ne servirait à rien d'augmenter le nombre d'exemples pour s'entraîner sur "tous" les jeux possibles, car l'apprentissage dans un tel cas est par essence impossible.

Donc la solution (j'en ai parlé un peu plus haut dans la discussion), c'est le prétraitement ! Dans le cas de la reconnaissance de caractères, ce qui se fait souvent, c'est commencer par isoler (donc reconnaître, mais par d'autres méthodes) des caractéristiques essentielles (intersection, etc.), puis de les positionner les unes par rapport aux autres.

Eléctions : Bush filled his SOUl with HOpe
0
Je suis bien d'accord avce toi, et je t'avoue que je ne comptais pas ne pas faire de prétraitement. Quand je disais augmenter le nombre de pixel, ca sous entendait quand même un prétraitement, de sorte que les caractères soient centrés dans la grille, et aient la même largeur ainsi que la même longueur.
Merci quand même de t'intéresser à mon programme.
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5 > xavier
9 janv. 2005 à 12:01
De rien :-)

Tiens-moi au courant de l'avancement...

Et puis si y'a un problème inattendu, ou si tu veux des conseils, pareil ;-)

Eléctions : Bush filled his SOUl with HOpe
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
15 févr. 2005 à 10:38
Salut Donny,

Je voulais t'envoyer un bon cours (http://www.metz.supelec.fr/~frezza/Cours.html : c'est celui que j'ai eu cette année) mais le seul lien qui ne marche plus, c'est justement le cours de DEA. Je laisse l'adresse parce qu'il y a surement d'autres liens utiles...

Sinon, je veux bien t'aider, mais sur des points précis que tu ne comprends pas : je ne remplacerai pas un cours ! Et surtout, je ne pourrai pas t'aider pour la programmation, je ne programme jamais rien ! ;-)

Donc comme mots clés, tu peux chercher (j'ai du parler de tout ça dans les posts précédents) : kohonen+paradigme (ou principe), cartes auto-organisatrices, compétition+neurones+"chapeau mexicain" (<- tout ça, c'est pour le principe), orientation orientée masque+entrée, valeurs nominales, apprentissage non supervisé, rétinotopie (pas obligatoire !!! c'est déjà plus avancé, comme notion), réseaux incrémentaux (pour ça, il doit y avoir un lien sur la page que je t'ai donnée vers la page de Fritzke : c'est lui qui a développé ça !)

Evidemment, tu mélanges tout ça, et quand tu auras l'impression de maitriser toutes ces notions, tu devrais être capable de te débrouiller. S'il y en a que tu ne trouves vraiment pas, tu peux m'en demander plus, bien sûr, mais je ne travaille pas exactement dans ce domaine...

Bon courage, y'a du boulot en perspective !
0
bonjour
si quelqu'un a déja essayé les filtre existant sous matlab me di quel est le meilleur pour filtrer un signal aléatoire (de parole) afin de ne pas perdre l'information et surtout pour extraire quelques parametres pertinents.
svp n'ésité pas a me donner la moindre idée je suis vraiment perdu
au revoir
0
Saadbou DIAWARA Messages postés 2 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 22 février 2005
22 févr. 2005 à 17:07
Salut
moi aussi j'ai besion voir le code source de ce programme mais plustot en java. En effet je dois presenter un memoir sur le data mining et vous savais ele reseau de neurones est un outil du data mining (sans doute le plus utilisé)
alors j'ai fais des recherches sur les codes java des differents outils du data mining mais je n'arrive tjrs pas a recevoir des reponses que j'attends vraiment
Si vous pouviez m'envoyer des codes portant sur le data mining ce serait vraiment gentil de votre part

merci et a bientot j'espere
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
26 févr. 2005 à 16:50
Bonjour à tous,
Je vois que sur ce forum les réponses apportées sont souvent pertinentes et intéressantes (ce qui n'est pas le cas de tous les forums il faut bien le dire...), donc je vais tenter ma chance à mon tour !

Voilà : je suis entrain de coder un réseau de neurone destiné à la reconnaissance de caractères manuscrits (je ne m'intéresse ici qu'aux chiffres, mais bon le principe est le même...). Mon réseau est un perceptron multi-couche :

- 1 couche d'entrée de 64 neurones (images de 8*8 pixels)
- 1 couche cachée au nombre de neurones variable
- 1 couche de sortie de 10 neurones (de 0 à 9)

J'utilise bien entendu un algorithme de rétroprogation du gradient pour le calcul des poids.
Pour l'apprentissage j'utilise une base de donnée de 3823 images de 8*8 pixels en niveaux de gris et environ 1800 pour les vérifications (cette base est gratuite et disponible à cette adresse :
http://www.ics.uci.edu/~mlearn/MLRepository.html
dans la section 'optdigits').

Au début mon réseau ne fonctionnait pas ou peu, comme pour un certain nombre d'entre vous (je suppose). J'ai alors décidé de paramétrer tout le réseau :

- fonctions de transfert à paramètres (et non pas une simple sigmoïde) : j'entends par là f(x) = 1/(1+exp(a*x)) translatée de plus entre -1 et 1 pour une meilleure efficacité (a variable)
- nombre de neurones de la couche cachée
- coefficient d'apprentissage : coeff pour la modification des poids : w = w +b*modif (b variable)

En procédant de la sorte on obtient tout de suite des résultats très satisfaisants et je pense que les documents que l'on peut trouver sur le sujet n'insistent pas assez sur ce point.
(personnellement j'ai trouvé a=(de 0,08 à 0,12 ) environ, et b entre 0,1 et 1 : b ne change pas grand chose à l'efficacité du réseau mais peut accroîrte la rapidité des calculs..).

En fait ce que je veux faire c'est étudier ce réseau à fond, et trouver les paramètres qui permettent d'obtenir un réseau le plus efficace possible (l'efficacité du réseau est pour moi la reconnaissance par le réseau des images de la base de vérification qui n'interviennent pas dans l'apprentissage, ainsi que le coût d'apprentissage ou la durée d'apprentissage ou le nombre de modification des poids lors de l'apprentissage, comme on veut).
J'ai déjà fait tourné mon PC pendant de nombreuses heures (une bonne journée au moins, et oui c'est très long !!!...), et certains résultats m'étonnent.

- Pour le paramètre des sigmoïdes tout ce passe comme je l'imaginait : si on représente l'efficacité en fonction du paramètre on obtient une forme de parabole avec un minimum (qui correspond pour mon réseau à 0,115 environ). Donc de ce côté là tout va bien !

- par contre plus j'augmente le nombre de neurones de la couche cachée et plus le réseau est efficace, aussi bien au niveau de la base de vérification qu'au niveau du coût des calculs (sans toutefois aller trop loin sinon le coût n'est pas négligeable) : moi qui pensait que le "bon nombre de neurones" de cette couche serait de l'ordre du nombre de neurones de la couche de sortie (comme c'est parfois conseillé dans les documents), j'obtiens des couches avec près de 20 à 100 neurones !!!

Est-ce que quelqu'un pourrait m'expliquer cela ??

Sinon concrètement pour l'efficacité j'obtient un taux de réussite au minimum de 3% sur la base d'apprentissage (ce qui fait quand même environ 60 exemples non reconnus) et bien sûr 100% sur la base d'apprentissage. J'obtiens de plus environ 60% d'efficacité sur des images que j'ai moi même scanées.

C'est pas mal, mais est-ce qu'il y a moyen d'améliorer ces résultats ??

Merci de vos réponses,
Matthieu
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
28 févr. 2005 à 23:38
Salut Matthieu,

Ca fait plaisir d'avoir un problème aussi bien posé !
Bon, y'a plein de choses à dire, alors je pense que je répondrai en plusieurs fois...

Avant tout, merci pour l'adresse de la base d'exemples, c'est toujours utile, des trucs comme ça.

Ce que tu fais là, c'est un travail de recherche de niveau mastere, alors si c'est pas indiscret... Tu fais quoi, dans la vie ?

Bon, première remarque sur tes 3 paramètres :
Le coefficient d'apprentissage (b) est très classique, et utilisé par tout le monde, normalement. Tu as bien identifié ce qu'il faisait, accélérer le calcul, mais pour être plus précis, il faut trouver un juste milieu : s'il n'est pas assez grand, ton réseau met des plombes à s'entrainer, mais s'il est trop grand, tu perds en finesse, et tu risque d'osciller (donc perdre du temps), voire de ne pas trouver le minimum global (les poids optimaux). Une solution simple et généralement employée, c'est d'avoir un paramètre variable : tant que les variations des poids se font dans le même sens, tu augmentes b à chaque pas de calcul, et quand tu sens que tu t'approche des poids optimum, tu diminues b à chaque pas.
Mon conseil : laisse tomber ce problème, il a été et est encore étudié, mais pour un raiseau donné qui doit faire un travail donné, si tu as un b qui a l'air de bien marché, n'y touche pas !

Deuxième paramètre : a
Je n'ai jamais entendu parler d'une paramétrisation de la fonction de transfert, et je dois dire que tes résultats me paraissent... étonnants. Je m'explique : tu me donnes l'impression d'avoir super bien étudié la question, puisque tu obtiens un paraboloïde avec un minimum bien marqué. Donc c'est une question qui mérite d'être approfondie ! Peut-être que tu es un précurseur sur ce point (on peut toujours rêver. En tout cas, je ne pourrais pas me prononcer avec certitude : je ne travaille pas dans le milieu des RN actuellement !). Mais juste une chose : est-ce que tu as bien réalisé cette "expérience" (parce que je sais que c'est long, l'expérimentation sur les RN, alors si tu as déterminé une parabole avec seulement 5 points, avant de breuveter ta découverte, vérifie ! Bon, OK, c'est un peu exagéré, mais c'était pour te montrer ce que je voulais dire) ?
En fait, si je me permets de douter, c'est pas pour rien : tu es d'accord pour dire que les poids sont des valeurs réelles (théoriquement) ? Donc la somme des entrées pondérées également. Et la valeur de sortie d'un neurone (en supposant par exemple qu'elle est comprise entre -1 et 1) doit pouvoir s'approcher de 1 ou de -1. J'en déduis (mais c'est à vérifier) que si tu peux obtenir un résultat en un temps donné avec une faible valeur de a, donc une sigmoïde "étirée", tu dois pouvoir obtenir le même résultat avec une sigmoïde "normalisée" (a=1), dans le même temps, juste en jouant sur le taux d'apprentissage b ! (dans ce cas, b sera plus faible). Peut-être que tu as fait ton test avec une valeur de b fixée qui favorisait effectivement a=0,115. A ce moment là, on retombe sur le problème de l'optimisation de b. Peut-être aussi que ta méthode, pour étirer les sigmoïdes, permet d'avoir plus de précision avec un codage fixé pour les réels. Mais je pense que des floatants sur 16 bits sont largement suffisant précis pour enregistrer des poids (puisque cette précision est négligeable devant b).

Quoi qu'il en soit, ces paramètres a et b n'interviennent que pour la rapidité d'apprentissage, et pas pour l'efficacité du réseau proprement dit.

On en arrive donc à la partie intéressante : le nombre de neurones de la couche cachée. Avant tout, il n'y a pas de recette miracle pour trouver le bon nombre de neurone d'une couche ! Il n'y en a jamais eu, et si certains textes conseillent de mettre le même nombre dans la couche cachée que dans la couche de sortie, il ne faut pas leur faire confiance ! En fait, ça pourrait marcher, si tu avais autant de neurones dans la couche d'entrée que dans celle de sortie : tu n'aurais aucune raison de changer ce nombre entre les 2 (et encore ! Ca dépend pour quoi faire !). Maintenant, pour passer de 64 à 10, il faut trouver un juste milieu qui peut effectivement être à 5 comme à 500 neurones ! Personellement, j'aurais commencé avec 40 (ça, c'est juste par expérience, je peux pas t'expliquer pourquoi en fait).
Mais il y a un point sur lequel j'aimerais revenir : tu utilises des "couches" abstraites qui ne tiennent pas compte de l'aspect "dessin" (donc planaire) de la représentation d'un chiffre. Alors je sais, on peut se dire que les connections vont se faire et se défaire au fil de l'apprentissage pour lier les neurones "proches", c'est-à-dire qui apparaissent souvent ensemble. Mais il reste un problème : a aucun endroit dans ton réseau tu n'indiques que 2 neurones voisins sur la grille d'entrée sont voisins par leur influence sur le réseau et peuvent éventuellement se substituer l'un à l'autre ! Il y a donc tout un paquet d'informations importantes dont tu ne te sers pas.
Il existe une solution bien plus adaptée à la reconnaissance de formes (donc de caractères) dans la catégorie RN : les cartes auto-organisatrices et tout ce qui en découle (j'en ai parlé plusieurs fois plus haut). Mais ne te décourage pas pour autant ! Ton réseau n'est peut-être pas ce qui se fait de mieux pour la reconnaissance de chiffres, mais il présentes un intérêt théorique, et peut même être utile pour un autre usage (à toi de découvrir). Et dans ce cas, ta base d'exemple, même en n'étant composée que de chiffres (donc de matrices) est un base comme une autre pour tester ton réseau !
Elle est peut-être juste un peu grande par rapport à la taille de ton réseau, ce qui te fait perdre un peu de temps : je pense qu'une cinquantaine d'exemples par caractère sont largement suffisants pour l'apprentissage !

Bon, c'est pas tout ça mais il se fait tard, donc la suite dans la semaines... N'hésites pas à répondre ! Surtout si tu n'es pas d'accord avec ce que j'ai dit ;-p
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
1 mars 2005 à 18:39
Eh bien ! ça n'a pas traîné !
Merci Franky* pour ta réponse.

>>> Tu fais quoi, dans la vie ?

Je suis en prépa maths !!! :-)
En fait je travaille sur ce sujet dans le cadre de mes TIPE...

>>> Coefficient b :

Je ne reviens pas dessus car on semble être d'accord.

>>> Coefficient a :

Je te confirme que j'ai réalisé des mesures très précises (et que d'autres sont prévues) : pour chaque couple de paramètres ( a , nombre de neurone de la couche cachée) j'entraîne 10 réseaux et je récupère pour chacun le nombre de modification des poids et le nombre de chiffres reconnus sur la base de test, puis ensuite j'effectue une moyenne des 10 valeurs... En effet je ne peut pas effectuer les mesures sur seulement 1 réseau, les poids initiaux étant choisis aléatoirement !

J' ai donc réalisé ces mesures pour 160 couples de paramètres (!!!) pour obtenir une belle surface en 3D !
J'observe donc la décroissance pour les neurones cachés et la cuvette pour le coeff a, pour le nombre de modifications.
J'observe la décroissance pour les neurones cachés, et une cuvette (applatie d'un côté) pour l'efficacité.
(si tu veux des images, je peux te les envoyer par mail)

J'aime bien ton idée de compensation de a par b et vis versa, et je vais voir si ça se vérifie expérimentalement. De toute manière je comptais réaliser à nouveau les mesures pour d'autres coeff d'apprentissage a.

>>> La couche cachée :

Ta réponse me rassure ! Merci ! ;-)

>>> Influence des neurones proches :

C'est vrai, dans mon réseau un neurone n'influence pas ceux qui sont proches de lui. J'avoue que je n'avais pas pensé à le faire, mais qu'aussi je ne vois pas trop comment le faire... faudra que tu me ré-expliques ça plus en détail... si ça apporte vraiment quelque chose pour ce type de réseau. (je verrais plutôt ça dans des réseaux de type Hopfieldiens...)

>>> La taille de la base d'apprentissage :

Je compte également réalisé des mesures en fonction de la taille de la base, mais ce que j'ai constaté sur quelques exemples (et ce qui me paraît tout à fait logique) pris pour des valeurs différentes de la taille de la base, c'est que l'efficacité est meilleure plus il y a d'exemples ! Par contre c'est vrai le coût d'apprentissage est moindre pour des bases plus petites (logique aussi).

>>> Les autres types de réseaux :

Tu vas rire, mais je compte également réalisé 2 autres réseaux de type carément différents (pour la reconnaissance de caractères toujours), pour de même effectuer des mesures, et au final comparer l'efficacité des 3 réseaux !! :-)

Je compte réaliser très prochainement :

- un réseau de type carte auto-organisatrice de Kohonen (comme tu me le conseille), mais je ne pensais pas que c'était lui le meilleur (d'après toi)

- un réseau de type mémoire auto-associative de Hopfield (j'avais déjà essayé, mais ça marchait pas... mais je compte recommencer !)

Je ne suis pas au bout de mes peines !!!
Et tu peut être certain que j'aurais besoin d'aide pour régler ces reéseaux !

Encore merci pour ta réponse,
@ très bientôt,
Matthieu
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5 > matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005
1 mars 2005 à 20:30
Salut,

>>Je suis en prépa maths !!! :-)
>>En fait je travaille sur ce sujet dans le cadre de mes TIPE...

Eh ben ! Ca, c'est ce qui s'appelle s'ouvrir à d'autres choses ! (je suis passé par là aussi ;-) ) Tu vises l'IMAG ? Les ENS ?
Si un jour, après une école, tu veux continuer dans la recherche, y'a une équipe dans mon labo qui s'occupe exclusivement des RN... J'en profite pour leur faire de la pub ! (équipe cortex au loria) Tu pourras toujours me recontacter à ce moment-là !

Pour le coef a, c'est bien ce que je pensais : t'as super bien fait ça !
Préviens-moi si ça se confirme... Ca a l'air d'être un résultat sympa.

L'influence des neurones proches, en fait, c'est du type Kohonen. J'y reviens après.

Pour la base d'apprentissage, il faut faire attention : a partir d'un moment, si tu augmentes trop sa taille, tu perds beaucoup de temps d'apprentissage pour un gain en précision négligeable...
Mais il ne faut pas non plus passer d'un extrême à l'autre : j'imagine que tu as entendu parler de surapprentissage (overfitting en anglais) ? Sinon, ça vaut le coup de chercher de quoi il s'agit, pour ce que tu fais...
Tant que tu y es, cherches aussi des infos sur le "compromis biais-variance", ça fera toujours bien quand tu passeras l'oral.
En résumé, la variance, c'est l'erreur d'estimation liée au manque de données (ce qui ne risque pas de t'arriver, là !), et le biais, c'est les erreurs d'approximation liées aux hypothèses, à la forme du modèle. Le problème c'est que pour un ensemble de données fixe, tu ne peux pas diminuer l'un sans augmenter l'autre... D'où la recherche d'un compromis.
Mais dans ton cas, ça veut surtout dire que tu as suffisemment de données pour ne pas avoir peur de complexifier (raisonnablement) ton modèle. Et également que tu n'as pas forcément besoin de toute ta base d'apprentissage.

Euh... désolé, je suis un peu parti dans mon trip, là... ;-p

Revenons aux différents types de réseaux, et pour commencer, le bon vieux Hopfield : c'est simple, je te le déconseille purement et simplement. Et ne t'en fait pas pour ton TIPE, c'est tout a fait justifiable de dire que les recherches récentes t'ont fait penser que tu n'avais pas intérêt à t'engager sur une voie sans avenir...
Je m'explique, il est possible que ce type de réseaux puisse présenter un intérêt. C'est d'ailleurs un peu mon domaine (IA distribuée, SMA, etc.). Le problème, c'est qu'on ne sait pas QUEL intérêt ! Parce qu'il y a une manière "naturelle" d'utiliser ces réseau, pour l'apprentissage, sauf qu'il ne sont pas très performants ! Ce qui fait que la recherhce dans ce domaine est un peu dans une impasse pour le moment... Ils présentent bien quelques avantages, avec en premier plan celui de reconnaitre des prototypes très fortements dégradés (images bruitées, ...). Seulement, on est obligé de lui faire apprendre par coeur ces prototypes, et sa capacité de mémorisation n'est pas géniale : de l'odre de 0,15 x le nombre de neurones, en comptant un neurone pour un pixel dans le cas de la reconnaissance d'images !

Maintenant, le Kohonen. Lui aussi, il a ses avantages et ses inconvénients. D'abord, il est très adapté à la reconnaissance de caractères, grace à la propriété dont je t'ai parlé hier : il sait reconnaitre des formes proches ! Par contre (il me semble l'avoir dit plus haut dans le discussion), dans ce cas, il y aura absolument besoin d'un prétraitement ! (sauf si tu sais que tous tes caractères ont la même taille, sont centrés, et ne sont pas trop bruités).
Mais surtout, il y a un point fondamental qui te concerne particulièrement : ta base d'exemples est visiblement utilisable pour un réseau de type perceptron, c'est-à-dire pour faire de l'apprentissage supervisé. J'en déduis que chaque image est associée à la bonne "réponse", le chiffre dessiné. Or les réseaux de type kohonen sont fait pour de l'apprentissage non supervisé : dans le cas où tu n'as qu'une collection d'images sans catégorie associée, un tel réseau est capable de rassembler ces images par ressemblance. D'où leur nom de cartes auto-organisatrices.
Ce qui veut dire que tu ne vas pas utiliser à fond toutes les ressources qu'offre ta base d'exemples, et il est finalement possible (même si ça m'étonnerait) que le perceptron marche mieux que Kohonen dans ton cas !

Bon, je te laisse méditer ça (autrement dit, on m'attend pour faire autre chose que mon autiste sur l'ordi ;-p ),
Bon courage !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
3 mars 2005 à 20:06
>>> Tu vises l'IMAG ? Les ENS ?

Euh.............. Nan faut peut-être pas exagérer pour les ENS...
J'espère "seulement" (et ce sera déjà pas mal) avoir l'ENSIMAG !

A part ça j'ai obtenu l'autorisation de l'administration de mon lycée pour pouvoir utiliser une salle informatique de 12 PC pour pouvoir faire tourner mes algos pendant plusieurs nuits !!!
D'ailleurs en ce moment même les PC tournent déjà !
Comme ça j'obtiendrais des résultats plus rapidement.

>>> Réseau de Kohonen :
Je crois que j'ai pas compris comment se faisait l'apprentissage pour ce réseau, et surtout j'ai pas compris, une fois que le réseau a été entraîné, comment fait-on pour avoir la sortie correspondant à l'entrée (la carte s'organisant toute seule, comment peut-on savoir quelle zone activée en sortie correspond à telle classe de chiffre ?) ?

@ +,
Matthieu
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
4 mars 2005 à 00:00
> Euh.............. Nan faut peut-être pas exagérer pour les ENS...
> J'espère "seulement" (et ce sera déjà pas mal) avoir l'ENSIMAG !

T'en fais pas, je te charriais ;-)
Et puis si t'as l'IMAG, c'est excellent !

Eh ben, ils sont cool, dans ton lycée, de te laisser autant de moyens ! T'es où ?

Bon, Kohonen.
Là, il est un peu tard pour que je t'explique tout l'apprentissage.
Par contre, je peux répondre rapidement à ta question : il faut te dire que ça n'a rien à voir avec le réseau à couches. Par principe, c'est auto-organisé, donc il n'y a pas de couche avec 10 neurones qui va te dire quel prototype a été reconnu. C'était utile pour l'apprentissage supervisé, pour pouvoir corriger la reconnaissance au fur et à mesure de l'apprentissage, mais là, l'utilisateur est un peu mis hors du système.
Alors je sais, tu vas me dire qu'au bout du compte, tu veux quand même savoir quel chiffre a été reconnu... La réponse te paraîtra simple quand tu auras compris la méthode d'apprentissage : c'est celui qui a été séléctionné par le réseau :-ppp

T'en fait pas pour ça, j'essaierai de répondre plus clairement demain. Dis-toi simplement que sur la "couche" qui nous intéresse (parce qu'on peut considérer qu'il y a 2 couches), c'est-à-dire la carte auto-organisatrice proprement dite, tu n'auras jamais d'équivalence 1 neurone = 1 pixel, mais au contraire 1 neurone = 1 caractéristique du caractère, voire ...= 1 caractère. Donc les neurones qui seront activés te donneront un résultat.

Petit exercice de réflexion en attendant le reste des explications : essaie de bien te faire à l'idée qu'on va différencier 2 distances. La première est la "distance" entre 2 caractères, en termes d'image, et la seconde, la "distance" sur la carte entre 2 neurones qui vont représenter une caractéristique du caratère ou, comme je l'ai dit plus haut, entre 2 caractères eux-même. On risque donc encore de parler de "distance entre 2 caractères", alors que ça n'aura rien à voire avec la première distance !
C'est pas très clair, mais essaie de bien différencier les 2, ce sera très utile par la suite...

A+
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
8 mars 2005 à 17:15
Salut Matthieu,

Désolé, j'ai pas trop pu venir avant...
Mais j'ai parlé de ce post à un copain qui s'y connait mieux que moi dans les RN (Johann), il te dira sûrement plein de choses intéressantes ! ;-)

Quand à mon explication sur les cartes de Kohonen, il faudra attendre encore, je suis pas trop dispo, là... Désolé.
Mais si tu as déjà un peu cherché des infos par ailleurs, je n'aurai pas grand chose à t'apprendre : je pourrais plutôt t'aider à comprendre des points obscurs.

Sinon, pour tes problèmes de nombre d'exemples, on voit effectivement que 1000 ou 1500 suffisent... (bon ,OK, j'avais dit 500 au début, j'atais un peu optimiste !)
En tous cas, bravo pour ton boulot, c'est impressionnant !

Bonne continuation,
François
0
slt, je désire connaitre comment extraire les contours d'une image,pour la reconnaitre avec un réseau de neurones, g trouvé codage de freeman, mai g besoin d'aide!!
0
Salut Fanky,

je souhaiterais avoir quelques conseils. J'ai un algorithme d'apprentissage a créer est je ne sais pa trop lequel serait le plus approprié. Mon algorithme doit etudier le mouvement du marché boursier (up ou down) d'une compagnie que j'ai choisi(CAC40). J'aimerais avoir de l'aide. S'il y a possibilité de rentrer en contact serait pas mal.

Merci.
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5 > LeXxX
4 déc. 2008 à 08:46
Salut LeXxX,

Je n'aurai pas le temps de beaucoup t'aider : je termine une thèse sur un sujet complètement différent, ce qui veut dire en plus que je n'y connait plus grand chose aux réseaux de neurones !

Ta question n'est pas assez précise pour que je puisse y répondre : donne-moi des exemples de données que tu dois obtenir, ou le style de questions auxquelles ton algo doit répondre.

Si je devais deviner : tu dois prévoir si la valeur monte ou baisse en fonction d'une dizaine de facteurs (des données diverses sur la bourse). Si c'est ça, tu dois utiliser un perceptron tout simple, sans te poser de questions (on doit pouvoir trouver des cours sur google)

Remarque en passant : le CAC 40 n'est pas une compagnie, c'est un indicateur boursier qui mélange les valeurs des 40 meilleures boites françaises.

Bon courage !
0
Salut !!

Bon j'ai parcouru rapidement le thread...
Effectivement Fanch à raison, il s'ai bien démené pour te répondre, respect à lui !!

Pour ce qui est des "connexions latérales", c'est valable dans plusieurs types de réseaux, Hopfield bien sur, mais aussi la CNFT qui est l'ancêtre des SOM (Self-Organizing Maps) de Kohonen. La différence est tout simplement que la CNFT (Continuum Neural Field Therory) fait "jouer la concurence"... C'est à dire que par le biais de connexion latérales, tous les neurones de la carte se disputent pour créer des bulles d'activités, jusqu'à stabilisation de la carte. Ceci dis, celà demande plusieurs itération pour une même entrée.
Les poids des connexions sont en chapeau mexicain, une double exponentielle positive dans l'entourage proche et négative plus loin, tend vers zéro à l'infini...

Kohonen à simplifié le principe avec le "winner takes all", c'est à dire que chaque neurone calcule la similitude de son entrée avec son prototype et on choisit le meilleur, on lui crée l'équivalent de la "bulle d'activité" (un gaussienne 2D) autour de lui. En fonction du coef d'activation de chaque neurone, le prototype de chacun est décalé vers l'exemple. L'amplitude de ses mouvement diminue petit à petit (diminution controllé par un paramètre).
La topologie finale de la carte décrit la densité des exemples (dans l'espace des prototypes, car comme l'a fait remarqué Franky, il faut bien distinguer cet espace, muni d'une distance, et la distance entre deux neurones (nb de connexions pour aller de l'un à l'autre))

Autre chose : la fonction d'action. C'est ici une "gaussienne" ou tout autre RBF (Radial Basis Function) centrée sur le prototype. Plus on s'éloigne du prototype, plus la valeur d'activation baisse...

L'apprentissage pour un tel type de carte, c'est de placer les neurones vers les centre de densités de la distribution des exemples.

Enfin, pour ensuite caractériser quelle classe d'exemple à été reconnu, là l'étiquetage de la base sera utile.
En fait dans le principe, rien ne t'interdit de coller un perceptron (donc mono couche) au dessus de la SOM !!!
Cela risque même de bien marcher.

Ce qui me chiffonne c'est les fortes hypothèses qu'il faut faire sur les exemples, qui risquent fort d'être irréalistes. Mais dans un cas d'école, c'est pas forcément génant... A toi de voir (pour le bruit, un pré-traitement possible est un simple flou gaussien. Si le rapport signal/bruit reste faible, c'est nikel !) Pour l'invariance en échèlle/translation, là faut un algo plus costaud, et ça sort du cadre...
Ceci dis, le système de reconnaissance de la poste US passe par deux couche de carte... A partir d'une rétine en 256x256 niveaux de gris, une première batterie de cartes 12x64, avec une connectivité partielle (chaque neurone de chaque carte prend en entrée une zone de la rétine, à neurone voisins, zones voisines), re belotte vers des cartes 12x16, puis enfin vient la "couche cachée", linéaire, classique, en connectivité totale et la couche de sortie.
Je sais pas si c'est bien clair, j'essaye de scanner le schémas la prochaine fois que je passe au labo.

En ce qui concerne ton apprentissage :
Je suis assez étonné par tes résultats en fonction de 'a'.
J'immagine que tu effectue l'apprentissage APRES avoir fixé le paramètre.
(Sinon c'est tout faux !)
Par contre à tu géré l'invariance des poids initiaux, je veux dire, pour des (a,b) différents, si les poids initiaux sont différents aussi, tu va te caler dans des minimum locaux différents.
Sinon, je ne m'expliques pas tes résultats : d'instinct, il me semble que la forme de la fonction de transfert n'influe pas sur l'EQM (Erreur Quadratique Moyenne), dès lors que l'apprentissage est bien fait.
Par contre ça influe sur la rapidité de l'apprentissage, ça, oui !!

Autre chose (qui pourrait aussi être une piste) : tu ne va pas assez loin dans l'apprentissage, tu n'atteint pas l'overfitting. Je ne veux pas dire qu'il faut l'atteindre, il faut s'arrêter avant, mais le fait de voir l'EQM remonter SUR LA BASE DE TEST indique qu'on a dépassé le seuil d'un apprentissage correct. Est c'est au niveau de ce minimum sur la courbe qu'il faut s'arrêter. Ce n'est pas toujours necessaire pour optenir des performances correcte, mais pour une comparaison de paramètres tel que tu le fais, je dirais que ça l'est (sinon c'est un peu comme déclarer un vainqueur d'une course à pied alors qu'il ne sont qu'à mi-parcours...)

Voilà, je te laisse réagir déjà à ça, si t'as d'autres questions, j'ai coché l'option pour les mails, tu dois pouvoir choper mon adresse.
Si jamais Franky t'as envoyé l'autre, je préfèrerais que tu utilise celle que donne ici !!!

Quote = "Franky" >>Bon, je te laisse méditer ça (autrement dit, on m'attend pour faire autre chose que mon autiste sur l'ordi ;-p ),

MOUARF !! Je crois avoir une idée ;°)

A+
0
le reseau de neurones ke je ss entrain de crer permet de reproduire les neurones reel les mouvement de flux d'infos pour k'1 handicapée puisse conduir par exmpl mais je trouve un problem lors de l'execution de la semul malgres ke la programation est juste je meetrai ma main a couper
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
10 mars 2005 à 17:11
Salut Johann et merci du temps que tu as consacré à ce message...

>>> J'imagine que tu effectue l'apprentissage APRES avoir fixé le paramètre.

Oui (enfin je suppose...) : je fixe a, b et tous les autres paramètres (nbr de neurones de la couche cachée, etc...), puis je lance l'apprentisasage sur un réseau avec initialement des poids aléatoires. L'apprentissage étant terminé, je réinitialise les poids et je relance l'apprentissage sur ce deuxième réseau, puis je continue comme une dizaine de fois ! Et je fait la moyenne des résultats...

>>> (Sinon c'est tout faux !)

Pas si sûr que ça !!! J'ai entendu parler d'algorithmes qui prennent 'a' comme un poids que le réseau modifie au fur et à mesure des itérations (un peu moins quand même que les autres poids...) ce qui permet d'optimiser et les poids et le coefficient de la sigmoïde ! (la correction à apporter se démontre comme pour la correction des poids...).

>>> Overfitting :

Tu voudrais dire qu'il faudrait que j'obtienne un minimum sur ma courbe du nombre d'erreurs sur la base de test en fonction du nombre d'exemples appris ? Si c'est le cas, je n'ai pas assez d'exemples... Ou alors il faut que je change les paramètres initiaux...

>>> Kohonen

Je vais essayer de trouver de la doc plus approfondie d'ici ce week-end, et je vais tenter de créer un premier algo pour y voir plus clair... Paske là ça reste encore un peu flou...

>>> Questions :

Si j'entraîne plusieurs réseau et que pour l'utilisation je confronte leur résultats, est-ce que j'obtiendrais de meillurs résultats ? (logiquement oui...) (est-ce que c'est ce que tu appelles 'batterie de cartes' pour la poste US ?)

Si j'entraîne un réseau de type Hopfield et un réseau de type PMC sur les mêmes exemples, et que pour l'utilisation j'effectue un prétraitement de l'entrée à l'aide du réseau de Hopfield et qu'à après je la fait reconnaître par le réseau PMC, est-ce que j'obtiendrais de meilleurs résultats ??

merci,
Matthieu
0
Tu ne répond pas à ma question. Est-ce que tu réinitialise les poids avec la même valeur pour tout les réseaux ? (J'immagine que les dix essais pour (a,b) fixés se font avec des valeurs de poids différentes, mais ces 10 couples sont-ils communs à tous les réseaux ?)

Correction de a : t'as un lien là dessus ?

Overfitting : Tu peux passer et rapasser la même base plusieurs fois !! Le but étant d'aller trop loin et de revenir à l'optimum.

Ta question : que veux tu dire par 'pour l'utilisation" ?
Logiquement, oui, si tu ne met pas assez de neurones cachés, tu restera trop général, avec trop, tu risque un over-fitting "rapidement"... Mais qui peut le plus peu le moins, avec trop de neurones caché tu peux rester aussi général et médiocre qu'un réseaux qui n'en a pas assez.
Il existe des méthode incrémentales/décrémentales (y'en a une qui marche pas bien, je sais plus laquelle).

Non, les "batteries de cartes" sont des "couches cachées parallèles".

Hopfield + PMC = pourquoi pas, j'y avais jamais pensé.
Logiquement oui, si la couche Hopfield débruite l'exemple et que le MLP (PMC, j'ai failli pas comprendre) le reconnait ensuite...
Le soucis c'est que le réseau type Hopfield ne sait mémoriser qu'un nombre assez limité d'exemple, ça risque donc de marcher pour une petite zone de l'espace où une distribution très concentrée sur quelques points...

Enfin à la reflexion je suis pas sûr du tout que ce soit une bonne idée. En plus, le MLP ne fait rien (enfin, pas grand chose...), tu pourrais le remplacer par un algo qui compare la sortie aux prototypes mémorisés et retourne la classe correspondante...
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
12 mars 2005 à 13:06
>>> Tu ne répond pas à ma question

Ah OK je vois ce que tu veux dire !
Non : à chaque fois je choisis les poids aléatoirement et ils sont différents pour chaque série de mesures...
Mais comme les courbes que j'obtiens sont plutôt continues j'en ai conclu que cela n'avait pas beaucoup d'importance !
Mais je peux très bien si tu veux refaire les mesures avec des poids identiques pour chaque série... Seul problème : lorsque je fais varier le nombre de neurones de la couche cachée, le nombre de poids à choisir n'est plus le même ! Alors comment faire ?

>>> Correction de a

Je n'ai pas de lien pour l'instant, c'est juste un ami qui avait trouver sur le net (je pourrais lui demander l'adresse du site où il a trouvé ça). Mais il m'a fait la démonstration sous les yeux et ça m'avait l'air juste...

>>> Overfitting

OK je vois : il faut donc que je fasse un apprentissage forcé, même si le réseau reconnaît déjà parfaitement la base d'apprentissage.

>>> que veux tu dire par 'pour l'utilisation' ?

C'est-à-dire que j'entraîne séparément un petit nombre de réseau (3 par exemple), puis une fois l'entraînement terminé, lorsque je voudrais reconnaître un chiffre, je le présente aux 3 réseaux et je compare leur résultats pour savoir quel chiffre a été reconnu majoritairement...

>>> Hopfield + PMC

C'était juste une idée comme ça, et de toutes façons vu que je ne risque pas d'avoir le temps de la tester...

>>> Kohonen

J'ai donc commencé mon réseau. L'algorithme fonctionne, mais je n'ai pas encore paramétré le tout, donc pour l'instant le réseau étant tellement 'basique' qu'il n'y a aucun résultats satisfaisant !
La carte s'organise un peu, mais seulement quelques neurones particuliers sont choisis comme vainqueurs (je veux dire par là que certains neurones ne sont jamais choisis comme vainqueurs, même sur près de 1000 exemples...). Enfin bon, vu que je n'ai encore rien réglé, ça ne m'étonne pas !

@+,
Matthieu
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
13 mars 2005 à 19:23
>>> Kohonen
Après paramétrage, ça me semble un peu mieux, mais pas tant que ça quand même...
Après quelques itérations j'observe des taches de neurones activées sur la carte, mais ces regroupements ne correspondent pas du tout aux chiffres !
En augmentant le nombre d'itérations, les neurones activés se séparent pour se répartir uniformément sur la carte, mais là encore un même neurone activé reconnait plusieurs chiffres, donc ce n'est pas concluant...

Matthieu
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
14 mars 2005 à 13:39
Ah OK, cette fois le message est passé (je n'avais pas relu les anciens messages depuis que j'avais réussi l'algo de Kohonen...).
Donc si j'ai bien suivi, il faut (par exmple) que j'augmente le contraste des images en entrée...

Sinon, j'ai modidifié la représentation de la carte que l'algo fournissait après l'apprentissage, et en fait les résultats sont légèrement meilleurs que ceux que j'annonçait précédemment...
On voit bien certains neurones qui ne s'activent que pour un chiffre particulier, par contre il y a toujours des neurones "atracteurs" qui ramassent un peu de tous les chiffres...
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
14 mars 2005 à 14:52
>>Donc si j'ai bien suivi, il faut (par exmple) que j'augmente le contraste des images en entrée...

Ben en fait... non, je crois pas que ça marche bien, ça (mais là,on est à la limite de mes connaissances sur le sujet !)

Je crois aussi que je confondais 2 solutions, donc je vais essayer de les expliquer toutes les deux, à toi de voir ensuite ce qui convient le mieux. Ou alors Johann, si tu passes par là, tu peux me corriger...

1) le réseau de Kohonen te sert pour le "prétraitement" (qui n'en est pas un dans ce cas !), c'est-à-dire que tu l'utilises comme tu le fais maintenant, il sépare plusieurs catégories reconnues, mais tu ne peux pas lui demander de reconnaitre des chiffres ou autres caractères : tu es obligé ensuite d'ajouter un petit algorithme qui, en fonctions des catégories reconnues (donc des caractéristiques de ton image), t'indique de quel chiffre il s'agit probablement. Par exemple, si tu as un neurones qui correspond généralement au 3 et au 8 (donc qui reconnait la forme globale à droite) et un autre qui correspond au 3 et au 7 (reconnaissance de la partie en haut à gauche, par exemple), ton algorithme pourra en déduire qu'il s'agit d'un 3. Seul problème "fondamental" : ça t'oblige à ne pas avoir 1 mais plusieurs vainqueurs. Sinon, c'est certainement la solution la plus simple pour transformer le réseau que tu as déjà. On pourrait également imaginer (mais là, ça va assez loin) que l'algorithme de post traitement soit lui-même un RN (comme ça, l'apprentissage est automatique et tu t'embètes pas).
Néanmoins, ce n'est pas la solution que je recommende !

2) Tu fais un prétraitement "à la main" (donc un algo simple), mais pas du style "contraste accentuer", plutôt quelque chose qui te transforme ton image d'entrée compliquée en 64*64 pixels (je sais plus combien tu as, en fait), en un image très simple, qui ne contient que des informations essentielles : pour reconnaitre des chiffres, je verrais bien une simple matrice 3*3 avec dans chaque case une information du style {absence de trait, extrêmité, trait continu}. Evidemment, si tu voulais reconnaitre tous les caractères du clavier, il te faudrait beaucoup plus d'informations pour pouvoir les séparer plus efficacement. Mais là, tu as seulement 27 matrices différentes possibles, et pourtant, ça devrait être suffisant pour la reconnaissance (si ça ne l'est pas, tu peux toujours complexifier ces matrices).
Une fois que c'est fait, c'est cette matrice que tu présentes à ton réseau de Kohonen, qui lui possédera peut-être 5*5 ou 10*10 neurones (peut-être plus, peut-être moins, j'en sais rien : là encore, il faut expériementer !). Et cette fois-ci, ce sont bien des chiffres que tu vas reconnaitre ! Sous forme de zones, plutôt que sous forme de neurones particuliers : si le neurone vainqueur est en plein milieu de la zones du 3, c'est un 3. S'il se trouve à la frontière des zones du 3 et du 8, t'en sais rien, mais ça voudra dire qu'il est très mal déssiné... Donc le post-traitement, pour savoir quel est le chiffre trouvé à partir du neurone gagnant, est très simple !
Cette solution me parait beaucoup plus élégante, et également adaptée à la notion de carte auto-organisatrice.
Et ce que je te disais précédemment, sur le meilleur pré-traitement possible, c'est juste savoir comment découper ton image : pour identifier des chiffres, ça doit être extrêmement courant, et plein de solutions doivent circuler sur internet. Et peut-être qu'il est mieux de découper ton image en une matrice 4*3 en ne retenant que l'orientation des traits, et non pas leur présence/absence + extrêmité ou pas, ça, je n'en ai aucune idée.

Je crois que j'ai été un peu plus clair, là :-)

Bon courage !
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
14 mars 2005 à 18:30
>>> Solution 1

C'est celle que j'envisageais de réaliser à terme, avant que tu ne me parles de prétraitement...

>>> Solution 2

OK je vois ce que tu voulais dire...
J'essaierais ça quand j'aurais un peu de temps (sur semaine c'est un peu dur), et comme j'ai plein de trucs à essayer sur ce réseau... Et puis il faut aussi que je finisse les mesures sur le PMC...
Mais tu sais les images que j'ai font seulement 8*8 et sont donc déjà très simples...

@+,
Matthieu
0
Bon, ben je vois que Franky à le cours d'Hervé dans la rétine... J'ai pas dit sous les yeux !!! A votre avis, le souvenir visuel siège dans dans V1, V2, V4 où alors c'est plus complexe ?
Moi c'est solution 4, interaction des 3 aires visuelles avec des cartes associatives, voire même auto-associatives dans l'hypocampe... Pour re-situer le souvenir... Enfin, la mémoire, de façon globale, est une belle inconnue (un peu à la manière de celle que j'attend de rencontrer, bref...)

Dis, Franky, tant qu'à lui donner des exemples inspiré du cours, on peut
lui donner la page, c'est pas un secret...
http://www.ese-metz.fr/~frezza/ (Mais il a les veuch' beaucoup plus courts, maintenant...)

Tu me dira, vu le gaillard de Freeza, je comprend que tu ais mieux retenu les SOM que les MLP... Moi mon système lymbique était activé rien que par la présence de Frédo, ce qui déclencha des flot de décharge d'acétylcholine, modalateurs mnémoniques.... (Enfin modulateur d'expression génétique, mais au final, ça revient à de la mémoire...)

Bon, POUR REVENIR AU THREAD...

Mat [34]
-> Evidemment, si tu fait varié le nombre de neurones cachés, tu ne peut pas utiliser les mêmes paramètres. Mais courbe 3D (si jamais elle a un sens dans ces conditions) sera toujours plus juste si tu ne fait varier qu'un seul paramètre (a) à la fois, plutôt (oui le chien de Mickey) que 15000 à la fois (c'est à dire TOUS les poids. Mais il faut, pour être exaustif, faire l'expérience en multiples point de l'espace des poids, pour une seule valeur du nombre de neurones cachés... Et recommencer ainsi pour chacune... A chaque fois concerver le meilleur résultat. Si tu obtient des résultat significatif, fait le nous savoir. Et ça prendra peut-être moins de temps de chercher le "théorème" dont je t'ai parlé. S'il existe.
Encore une fois, je veux bien croire qu'il existe un 'a' optimal en terme de temps de convergence sur une base donnée, et pour un réseaux donné, mais j'ai du mal à concevoir que ça puisse ce généraliser. Corollaire : en un temps fini, n'importe quel 'a' fera l'affaire...

->overfitting : Plutôt (encore ce chien!) que de parler d'apprentissage forcé, je parlerais de sur-entrainer, à répétition, ton réseau, pour voir "jusqu'où il faut s'arrêter." OK, vite dis, ça revient au même...

***Franky [38]
-> exemple 1) Il n'est pas question, lors de la reconnaissance, d'avoir "1 vainqueur" !!! Il y a un taux de reconnaissance par neurone, basta.
A l'utilisateur de voir ce qu'il veux en faire, un winner takes all, pkoi pas, mais rien n'oblige, au contraire !!!
Et en l'occurence (quelque soit le prétraitement) un MLP par dessus peux se justifier... Afin de déterminer automatiquement quel sont les "connexions" à établir entre les activations des différents neurones de la SOM...

Voire même, un onzieme neurone pour dire "je sais pas".

-> Même en 8*8 tu peux appliquer les conseils de Franky... Et de Hervé.
Néanmoins, mon ami, ne feraisse pas une "matrice" 3*3*3 binaire, soit 27 entrée (ce qui n'est pas un soucis Mat, je chambre Franky :P)
A part ce détail, F, tu m'as paru très clair, même que tu m'a remis des choses en ordre !! :D

Voilï voîloù....

PS : c'est quoi se forum où on écrit en pates de mouche, c'est un coup à faire plus de fautes qu'on ne le crois... J'suis hypermétrope, et mon réseau électrique foireux brouille l'écran périodiquement... lol

PPS : j'attend toujours la réponse au mail que j'ai envoyé samedi en ton nom. Mais t'inkièt "il" n'est pas très réactif sur l'adresse perso... (Au pire je le spamme sur l'adresse pro >:) )
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
15 mars 2005 à 10:32
Dis donc, toi, avant de me charrier, lis ce que j'écris ! :-p
-> J'avais déjà donné l'adresse, y'a un moment
-> pour l'exemple 1, j'ai jamais dis qu'il y avait 1 vainqueur !
C'est pour l'exemple 2 que je l'ai dit, ce qui me semble assez réaliste : vu la manière dont est réalisée la compétition, on a toutes les chances (bon, OK, c'est juste intuitif) d'avoir une "bosse" à un endroit sur la carte, et son sommet correspond à la valeur reconnue (en fait, la carte sera surement trop petite pour qu'il y ait 2 "bosses")

sinon, une "matrice" 3*3*3 binaire, ça fait bien 2^27 entrées et pas 27, mais de toutes façons dans notre cas, on a une matrice 3*3 avec trois valeurs exclusives possibles, soit 3^9 entrées différentes... On coupe la poire en 2 ? ;-)

Merci quand même pour le compliment :-)))
Et pour ton PPS : après vérification, tu ne m'as pas envoyé de mail samedi... T'aurais pas quelques connections en trop ? C'est les fils qui se touchent un peu ?
0
Désolé pour l'histoire du lien, j'avais la flemme de tout relire.

Pour les vainqueurs, si si !! J'te jure
[quote]
ton algorithme pourra en déduire qu'il s'agit d'un 3. Seul problème "fondamental" : ça t'oblige à ne pas avoir 1 mais plusieurs vainqueurs
[/quote] c'est bien dans ton 1èrement, ça ?
Ce que je disais, c'est que le winner takes all n'est obligatoire que pendant l'apprentissage, pour simuler la bulle d'activité qui résulterais de la concurence si on la laisser jouer.
Même si on choisit souvent le vainqueur lors de la reconnaissance, ce n'est pas obligatoire.

Et y'a pas de compétition en Kohonen, elle est justement, simulée. Les connexion latérales ne sont là que pour induire la topologie, contrairement à la CNFT (qui ressemble beaucoup) où là y'a vraiment une copèt, mais qui demande beaucoup plus de cyle pour être évaluée (en plus y'a pas de critère d'arrêt clairement défini).

Toi aussi t'a la charrue facile, l'ex-électronicien que je suis considère qu'une entrée c'est un fil qui ammène une valeur de tension.
Selon cette définition c'est bien 27 entrées qui peuvent prendre, en binaire, 2^27 ETATS possibles. Mais bon, ça tourne au chipotage !!
Ok pour la poire !
Je raisonnais en binaire parceque c'est... assez logique en informatique, non ? Bref, on s'en fout.

Le mail : MOUARF !! Je parlais à Matt !!! Mais comme j'ai pas précisé, j'avoue que ça a du te faire drôle....
0
matmdx Messages postés 30 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 2 avril 2005 34
19 mars 2005 à 19:48
Retour sur le PMC :

J'ai réalisé de nouvelles mesures sur mon PMC, cette fois-ci en fixant le nombre de neurones de la couche cachée (50 neurones), et en faisant varier les 2 autres paramètres (à savoir a, le coefficient de la sigmoïde, et b le coefficient d'apprentissage).
J'obtiens les résultats suivant :
http://site.voila.fr/updt/tipe/tipe.htm

(cette fois-ci j'ai mis les courbes en 3D avec une animation pour que vous puissiez bien voir..., ainsi qu'un tracé en courbes de niveau...)

Les résultats sont assez étonnant (pour moi en tout cas) : il semblerait que pour un coefficient choisi, il existe forcément une valeur de l'autre qui permette d'avoir le minimum (de temps de calcul et de test sur la base), ce minimum étant commun à tous les couples de coefficient (je sais, j'explique pas très bien , mais bon les tracés parlent d'eux mêmes...).

En faisant une petite regression, je trouve la relation (plutôt simple) entre a et b pour qu'il y ai minimum :
racine(b)*a=1/10

Il me reste à voir si cette relation est toujours valide si je refais les mesures avec une autre valeur pour le nombre de neurones de la couche cachée, et s'il est toujours valable si je change le nombre d'exemples avec lesquels je fais l'apprentissage (ici je l'ai fait seulement avec 1000 exemples...).

Voila pour le moment,
Matthieu
0
franky* Messages postés 165 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 4 décembre 2008 5
19 mars 2005 à 20:43
Salut,

Super, ton petit site avec les animations !

>> Les résultats sont assez étonnant (pour moi en tout cas)
Eh ben moi, pas du tout !
Voir là : http://www.commentcamarche.net/forum/affich-1062042-Programmer-un-r%E9seau-de-neurones#23
Et en particulier :

"J'en déduis (mais c'est à vérifier) que si tu peux obtenir un résultat en un temps donné avec une faible valeur de a, donc une sigmoïde "étirée", tu dois pouvoir obtenir le même résultat avec une sigmoïde "normalisée" (a=1), dans le même temps, juste en jouant sur le taux d'apprentissage b ! (dans ce cas, b sera plus faible). Peut-être que tu as fait ton test avec une valeur de b fixée qui favorisait effectivement a=0,115. A ce moment là, on retombe sur le problème de l'optimisation de b."

Bon, je sais, c'est un peu prétentieux de se citer soi-même, mais c'est pour pas tout réexpliquer...
En tout cas, ça explique très bien ce que tu observes : un minimum constant, avec plein de couples {a,b}.
On voit aussi que ta relation rac(b)*a=constante correspond à ce qu'on attendait : si on augmente a (donc on "rétrécit" la sigmoïde), il va falloir un "grain" plus fin dans la recherche des bons poids, c'est-à-dire un plus faible taux d'apprentissage b. C'est vrai que la relation parait simple, mais là encore, ça n'aurait rien d'étonnant si elle était exacte. Je ne dis ça que de manière intuitive : on pourrait prouver formellement (ou pas !) que ça marche, en poussant assez loin une analyse mathématique, mais ce serait perdre du temps pour rien. En effet, une analyse qualitative (ton dessin, en plus de l'intuition que j'avais eue au début) montre que l'on a une relation du style FonctionCroissante (a) * FonctionCroissante (b) = cte, et peu importe de savoir laquelle, d'autant plus qu'en général, ce genre de relations est très souvent simple, justement (ça, je l'ai appris en mécanique des fluides, et en étudiant l'épistémologie).

Et c'est alors une très bonne idée de faire d'autres expériences pour pouvoir la confirmer (plutôt qu'une preuve quantitative), sauf que tu ne pourras pas, dans ton cas, affirmer plus que ton résultat actuel. Je m'explique : si tu trouves toujours une relation rac(b)*a=constante , tu ne seras pas plus sûr de sa validité que maintenant, car les nouvelles expériences seront trop proche de l'ancienne (tu te contente de faire varier le nombre de neurones de la couche cachée, alors que pour valider d'équation, il faudrait chager entièrement le réseau, et même le problème posé !)
Bref, tout ça pour dire que tu ne peux pas (lors de l'oral) affirmer que cette equation est juste, mais qu'elle l'est certainement, et que c'est justifiable.
Avant de faire une nouvelle expérience, essaie plutôt de suivre une méthode "plus scientifique" : pose des hypothèses !
Autrement dit, demande-toi quels résultats tu vas obtenir (et par la même occasion, si les expériences que tu veux faire sont bien nécessaires...)
A mon avis (encore une fois, je ne me suis pas penché plus que ça sur la question), changer le nombre d'exemples de la base d'apprentissage ne te donnera pas de résultats exploitables (sauf si tu as une idée de ce que tu veux prouver avec, idée que je n'ai pas eue). Par contre, changer le nombre de neurones cachés est excellent : cela permettrait de prouver l'idée (explication intuitive) que j'ai citée en début de post, dont un corrolaire (à vérifier !) est que tu vas conserver la constante de 1/10, mais que le minimum de temps de calcul va varier, lui. Et tu vas ainsi pouvoir obtenir le nombre de neurones optimal, non plus en refaisant un graphe à chaque fois pour voir le minimum, mais en ne prenant qu'une valeur de a et b, puisque tu auras prouvé que dans tous les cas (de a et b), le minimum est le même.

Voila, formellement ça ne change rien, mais les examinateurs apprécieront la démarche ! :-)

A+
0