manittarafik
Messages postés7Date d'inscriptionlundi 19 mars 2012StatutMembreDernière intervention20 mars 2012 23 févr. 2012 à 15:15
salut je m'interesse au réseau de neurone et je cherche à realiser un perceptron multi couche pour le problème de XOR en java,est ce que vous pouvez me donner quelque site qui peut m'aider.merci d'avance
terkou
Messages postés8Date d'inscriptionmercredi 25 janvier 2006StatutMembreDernière intervention21 avril 2010 21 avril 2010 à 17:58
je m'interresse au reseau de neurones. je cherche à réaliser un systeme de reconnaissance de caractères.
mais je n'arrive pas à lire les fichiers publiés par Jack.
je code en C et utilise Eclipse (Wascana )
merci beaucoup
nicorenejaque
Messages postés8Date d'inscriptionsamedi 12 mars 2005StatutMembreDernière intervention 4 avril 2010 4 avril 2010 à 21:12
A quoi sert la variable terme_stochastique, qui appartient à la classe neurone ?
Je ne l'ai vu utilisé qu'une seule fois, dans le constructeur...
anisboujelbene
Messages postés1Date d'inscriptiondimanche 28 octobre 2007StatutMembreDernière intervention 7 décembre 2007 7 déc. 2007 à 12:10
j'essai de compiler ce code avec le microsoft visual studio 6 mais ça marche pas puisque la bibliothèque alloc.h n'existe pas.
mème en remplaçant include <alloc.h par include <malloc.h , il me sort plusieurs erreur
J'ai télécharger de net un fichier alloc.h mais toujours ça compile avec des erreurs
Y a t il des solutions???
cs_kaouter
Messages postés3Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention21 mars 2007 12 mars 2007 à 14:31
la modifications des poids sont automatique au niveau d'algorithme de gradient .il faut saisir d'abord les entreés et initialiser les poids de façon aléatoire et deciver ton réseau ( le modéle ) .puisque le but d'algorithme de gradient est de minimiser léerreur entre la sortie obtenue et la sortie désirée .
davidla3000
Messages postés5Date d'inscriptionsamedi 11 octobre 2003StatutMembreDernière intervention17 janvier 2006 17 janv. 2006 à 14:34
Je voies que le sujet sur les réseaux de neurones plutôt que l'aspect programmation. Et bien soit parlons en !
l'algorithme de back propagation, est l'un des algorithmes les plus simples (hors demonstration mathématique) et des plus utilisé, il permet faire apprendre par jeux d'exemples (motif d'entré associé a un motif de sortie). c'est un algorithme a base de mémoire associative, avec un apprentissage supervisé. L'utilisation d'un tel algorithme pose néanmoins pas mal de condition pour l'apprentissage (nombre de neurone, coefficient d'apprentissage, nombre de motif en entrée a apprendre, ?) a l'époque je suivais les recommandations de yann le cun pour tous ces parametres, mais surtout pour minimiser l'erreur du réseau.
Ce sont des modeles classiques en connexionisme, actuellement, on recherche des modeles plus puissant permettant de reconnaître des motifs déformés dans l'espace, mais aussi dans le temps (voir boucle récurentes, le modèle de jordan ou elman, delai time, integrate and fire).
J'ai trouvé un situe ou vous pourrez trouver de la bonne lecture
il s'agit de theses, je vous recommande de lire Stéphane DURAND et Nicolas PICAN, ils ont un regard critique sur certain modele.
En ce qui concerne ton programme :
- pas mal l'idée de généré des couches de neurones au besoin, cepedant lorsque tu developpes un réseau suivant un besoin spéficique, par exemple celui utilisé par la poste a une rétine de 16x16, qui pointe sur une couche cache de n cluster (c'est a dire n groupe de neurone identifiant un meme motifs, soit tous les neurones d'un groupe ont les meme poids synaptique.).
- Le nombre de neurones, tu as deja du le lire quelques part, trop de neurones ne permet pas la classification, et pas assez peut faire que ton reseau n'aboutisse pas.
- Les coeficients, il y a plusieurs coeficient la fonction simoïde f(x)=tanh(x) serait plutot f(x)=m*tanh(k*x), Yann le cun modifiait ces parametres (k,m), pour eviter les minimas locaux. Le coefcient alpha pour la correction des poids etait evolutif, un peu comme pour Kohonen. Yann le cun disait qu'il vallait mieux diminuer le seuil de l'erreur du reseaux par serie de motfis présenté et de modifier egalement alpha en consequence, toujours afin d'eviter les minimas locaux.
cs_hitcher
Messages postés21Date d'inscriptionjeudi 8 avril 2004StatutMembreDernière intervention15 septembre 2009 18 déc. 2005 à 12:07
J'ai bossser sur les réseaux en finance. Je n'ai pas de conseil a donner sur la programmation, je suis un débutant. Par contre de l'expérience que j'en ai tiré sur MatLab il est très interessant que tu puisse définir les connections neuronne par neuronne et pas couche par couche. Par exemeple si les poids recuent par un neuronne sont [100 100 1]. Tu vois bien que tu peux déconnecter la troisième liaison (=1) qui n'apporte que du bruit, de plus cela evite les phénomenes de surapprentissage liée au Reseaux de neuronnes et rend donc ton perceptron plus parcimonieux. Pour de la littérature: "Réseaux de neuronnes" Eyrolles de G. Dreyfus, JM. Martinez, M. Samuelides
Bel0
Messages postés71Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention14 septembre 2007 14 déc. 2005 à 23:44
Tout faire apprendre à un réseau de neurones, oui c'est possible, le seul problème c'est qu'il faut un temps considérable pour entrainer ces réseaux. Si tu veux faire un module d'intelligence artificielle pour un jeu, il serait sans doute plus intéressant de faire des algorithmes utilisant la recherche alpha-beta ou A* (astar) . Si tu tiens absolument à utiliser une réseau de neuronnes (multi-layer perceptron: MLP en anglais), tu devrais t'orienter vers le logiciel WEKA. Il est écrit en java et permet entre autre d'entrainer toutes sortes de réseaux de neuronnes. A partir de ça, tu devrais avoir plus facile à comprendre comment fonctionne la mise à jour des poids du perceptron ... ce n'est pas la chose des plus facile (pas mal de maths dans l'affaire).
En résumé (mais vraiment très résumé):
Un training set est ensemble de valeurs qui sert à entrainer le réseau. Chaque élément de cet ensemble contient toutes les valeurs d'entrés du réseau et la valeur de sortie du réseau correspondante.
- Au début d'une itération, on possède un ensmeble de poids qui pondère les différents inputs d'un neuronne et ce pour tous les neuronnes.
- A l'aide d'une élément du training set, on peut évaluer l'erreur comise par le réseau (valeur de sortie du réseau pour l'instance - valeur de sortie du réseau en
utilisant les poids actuels).
- Grâce à cette erreur, on peut mettre à jour les poids du réseau de façon à minimiser l'erreur commise (le carré de l'erreur commise en fait): la méthode pour effectuer la minimisation de l'erreur s'appelle en fait gradient descent.
- Recommencer l'itération tant qu'on a une diminution de l'erreur.
A la fin des itérations, on se trouve dans un endroit (un point dans l'espace à n dimensions où n représente le nombre de poids) qui est le minimum LOCAL de la fonction d'erreur dans cette espace à n dimensions. Il faut bien garder à l'esprit que cette règle de mise-à-jour des poids ne trouve qu'un minimum local à la fonction d'erreur. La solution trouvée n'est donc pas LA solution optimale mais une approximation.
Il y a un bouquin utilisé dans les cours d'intelligence artificielle: "Machine Learning" de Tom Mitchell (ISBN 0070428077). Le site du livre propose aussi des transparents comme base pour des cours: http://www.cs.cmu.edu/~tom/mlbook-chapter-slides.html. Le chapitre 4 devrait particulièrement t'intéresser je crois ;)
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 14 déc. 2005 à 19:17
Tu peux en théorie faire apprendre tout et n'importe quoi à un réseau. J'ai testé la restitution de données après compression sur les couches internes, avec un perceptron à 3 couches. Les résultats sont tels qu'espérés, c'est à dire bon tant que l'échantillon de données tests n'est pas trop grand par rapport au nombre de neurones des couches internes.
Pour le paramétrage de ton réseau, il n'y a pas de règle absolue. Tout dépend ce que tu veux en faire. Le nombre de couches, le nombre de neurones par couches, etc. dépendent du type de résultat que tu veux obtenir. Mais il faut toujours garder à l'esprit l'efficacité du réseau : plus un réseau a de couches et/ou de neurones par couche, plus l'apprentissage et même le calcul du réseau, prennent du temps. A toi d'essayer de trouver le meilleur compromis rapidité/fiabilité de ton réseau suivant l'utilisation que tu souhaites en faire.
Très souvent, le nombre de couches n'excède pas 3. Plus de couches n'améliorent pas les performances du réseau ; cela peut même avoir l'effet inverse.
lebojojo
Messages postés1Date d'inscriptionmardi 25 octobre 2005StatutMembreDernière intervention14 décembre 2005 14 déc. 2005 à 16:41
Desole de mettre du temps a repondre mais en semaine j'ai pas un acces facile au net.
Pour l'interface H-M en fait c parce que je ne voulais pas faire un prog de reseau de neurones complet mais juste calculer personnellement des coefs pour les adapter a mes besoin:c'est entre autre pour ca que ça n'accepte pas d'autre fichier pour les valeurs et que je n'ai pas trouvé utile de verifier qu'on ne mette pas une donnée incorecte genre un char.
Merci Vdust pour tes critiques et surtout celle concernant la gestion de la memoire de l'ordi.Sinon quel genre de fonctions a tu reussi a faire apprendre et quel nombre de couche a tu utilisé car c'est sur la maniere de bien parametrer un rdn que j'ai des lacunes(et aussi sur comment optimiser mon algorithme d'apprentissage).
Sinon Dominion si tu veux utiliser le programme tu dois avant dans les souces mettre NB_EX a la valeur nombre d'exemple que tu veux presenter, KPRECISION doit etre réglé sur la precision du resultat que tu veux obtenir et sinon tu met un nombre suffisant de coef dans le fichier coef.txt ,sachant que chaque neurone d'une couche est reliée a tous les neurones de la couche suivante.Et enfin dans le fichier entree.txt tu met les valeurs d'entrée et dans le fichier sortie.txt les valeurs de sortie correspondantes et en conservant le meme ordre.Voilà tout .
cs_dominion
Messages postés230Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention15 mai 2008 13 déc. 2005 à 23:35
Tout ça, je sais, c'est le côté pratique qui me fait défaut... Je ne trouve pas d'explication pratique d'un réseau de neurones !!! Je veux dire par là une implémentation expliquée et un joli doc qui explique pourquoi cette fonction, pour quoi cette archi etc...
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 13 déc. 2005 à 18:49
Les réseaux de neurones peuvent servir à plein de choses. En pratique, ils sont utilisés notamment dans tous les problèmes de détection de formes : par exemple la Poste utilise un programme à base de réseaux de neurones pour identifier le code postal (les algorithmes utilisés mettent en oeuvrent un couplage deux types de réseau pour accroître les performances : les perceptrons et les réseaux de Hopfield (voir la source 19075 sur ce site à ce sujet). Les OCR fonctionnent exactement sur le même principe, mais les réseaux utilisés sont dans l'ensemble plus complexes, puisqu'ils sont moins spécialisés (seuls les chiffres de 0 à 9 sont nécessaire pour les codes postaux).
Certaines intelligences artificielles de jeux se servent également de réseaux de neurones.
Chose amusante à tester, on peut aussi faire de la compression d'images avec un perceptron multicouches...
cs_dominion
Messages postés230Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention15 mai 2008 13 déc. 2005 à 13:39
J'y connais pas grand chose sur les réseaux de neurones, mais ça m'intéresse beaucoup !
Tu n'aurais pas une ou deux url (ou livre) à me conseiller ?
Au fait, je suppose que ça vient de moi, mais ton programme foire lorsque je fais un apprentissage... Ca serait super si tu écrivait une petite doc sur comment utiliser ton code, et aussi une application pratique de ton algo (je ne sais pas trop si dans le cas des réseaux de neurones il y ai vraiment un réseau designé en fonction de l'application, enfin j'avais compris que c'était assez abstrait et général)
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 13 déc. 2005 à 04:11
C'est une base très intéressante, et le code a le mérite d'être très clair. J'ai cependant plusieurs critiques (constructives je l'espère) :
Ce qui est dommage, c'est que la classe 'reseau' soit aussi liée à l'interface Homme-Machine : les tâches comme la demande d'informations à l'utilisateur, la lecture des données d'un fichier, etc., je les aurais personnellement laissé au 'main', en passant les données récupérées en arguments aux fonctions de la classe. Par exemple, le réseau lit des fichiers prédéfinis : mais un programme utilisant tes classes peut avoir besoin de passer des données d'apprentissage lues dans un autre format de fichier, ou demandées directement à l'utilisateur du programme.
De plus, et je trouve qu'il y a ici une bonne habitude à prendre (et à moindre effort) lorsqu'on veut écrire un code portable, ça serait encore plus clair si chaque classe était définie dans un fichier différent, en utilisant des headers pour les déclarations. Avec une telle structure, le code serait plus facilement réutilisable et te permettrait aussi de mieux voir où doit s'arrêter le rôle de chaque classe.
Sinon, il y a une très grosse optimisation à faire au niveau de tes couches. La séparation en réseau/couches/neurones est une conception très "visuelle". Mais si l'on se place au niveau de la mémoire de l'ordinateur, on constate que les neurones d'une même couche sont éparpillés (chaque neurone étant créé par une instruction "new"), ce qui est catastrophique en terme de temps d'accès aux différents neurones, accès qui sont extrêmements fréquents lors de la rétropropagation ( à la récupération des valeurs des neurones d'une autre couche pour chaque neurone de la couche.). Même si d'un point de vue conceptuel, la séparation est élégante, d'un point de vue calculatoire, il est préférable de "fusionner" le concept de neurone à la classe "couche", en créant des tableaux pour chaque propriété des neurones. Comme dans ce cas, les différentes valeurs se suivent en mémoire, les accès sont beaucoups plus rapide, et le temps d'apprentissage en est très sévèrement amélioré.
Malgré toutes ces critiques, bravo pour ton programme, qui, même si l'interface H-M ne gère aucune erreur de saisie au clavier (entre autres, un caractère non prévu (comme 'a', que j'ai malencontreusement tapé à la place de '1') fait boucler le programme), a le mérite de fonctionner correctement.
23 févr. 2012 à 15:15
21 avril 2010 à 17:58
mais je n'arrive pas à lire les fichiers publiés par Jack.
je code en C et utilise Eclipse (Wascana )
merci beaucoup
4 avril 2010 à 21:12
Je ne l'ai vu utilisé qu'une seule fois, dans le constructeur...
7 déc. 2007 à 12:10
mème en remplaçant include <alloc.h par include <malloc.h , il me sort plusieurs erreur
J'ai télécharger de net un fichier alloc.h mais toujours ça compile avec des erreurs
Y a t il des solutions???
12 mars 2007 à 14:31
17 janv. 2006 à 14:34
l'algorithme de back propagation, est l'un des algorithmes les plus simples (hors demonstration mathématique) et des plus utilisé, il permet faire apprendre par jeux d'exemples (motif d'entré associé a un motif de sortie). c'est un algorithme a base de mémoire associative, avec un apprentissage supervisé. L'utilisation d'un tel algorithme pose néanmoins pas mal de condition pour l'apprentissage (nombre de neurone, coefficient d'apprentissage, nombre de motif en entrée a apprendre, ?) a l'époque je suivais les recommandations de yann le cun pour tous ces parametres, mais surtout pour minimiser l'erreur du réseau.
Il existe en France quelques bon guide pour les réseaux de neurones (les principaux : perceptron, adaline, regle de Widrow-Hoff, hopfield, aprentissage par pénalité, les fonctions radiales de base, Boltzman et Kohonen) voici une adresse
http://www.up.univ-mrs.fr/Local/umr_6149/umr/page_perso/Touzet/Les_reseaux_de_neurones_artificiels.pdf
Ce sont des modeles classiques en connexionisme, actuellement, on recherche des modeles plus puissant permettant de reconnaître des motifs déformés dans l'espace, mais aussi dans le temps (voir boucle récurentes, le modèle de jordan ou elman, delai time, integrate and fire).
J'ai trouvé un situe ou vous pourrez trouver de la bonne lecture
http://cortex.loria.fr/fr/publications.html
il s'agit de theses, je vous recommande de lire Stéphane DURAND et Nicolas PICAN, ils ont un regard critique sur certain modele.
En ce qui concerne ton programme :
- pas mal l'idée de généré des couches de neurones au besoin, cepedant lorsque tu developpes un réseau suivant un besoin spéficique, par exemple celui utilisé par la poste a une rétine de 16x16, qui pointe sur une couche cache de n cluster (c'est a dire n groupe de neurone identifiant un meme motifs, soit tous les neurones d'un groupe ont les meme poids synaptique.).
- Le nombre de neurones, tu as deja du le lire quelques part, trop de neurones ne permet pas la classification, et pas assez peut faire que ton reseau n'aboutisse pas.
- Les coeficients, il y a plusieurs coeficient la fonction simoïde f(x)=tanh(x) serait plutot f(x)=m*tanh(k*x), Yann le cun modifiait ces parametres (k,m), pour eviter les minimas locaux. Le coefcient alpha pour la correction des poids etait evolutif, un peu comme pour Kohonen. Yann le cun disait qu'il vallait mieux diminuer le seuil de l'erreur du reseaux par serie de motfis présenté et de modifier egalement alpha en consequence, toujours afin d'eviter les minimas locaux.
18 déc. 2005 à 12:07
14 déc. 2005 à 23:44
En résumé (mais vraiment très résumé):
Un training set est ensemble de valeurs qui sert à entrainer le réseau. Chaque élément de cet ensemble contient toutes les valeurs d'entrés du réseau et la valeur de sortie du réseau correspondante.
- Au début d'une itération, on possède un ensmeble de poids qui pondère les différents inputs d'un neuronne et ce pour tous les neuronnes.
- A l'aide d'une élément du training set, on peut évaluer l'erreur comise par le réseau (valeur de sortie du réseau pour l'instance - valeur de sortie du réseau en
utilisant les poids actuels).
- Grâce à cette erreur, on peut mettre à jour les poids du réseau de façon à minimiser l'erreur commise (le carré de l'erreur commise en fait): la méthode pour effectuer la minimisation de l'erreur s'appelle en fait gradient descent.
- Recommencer l'itération tant qu'on a une diminution de l'erreur.
A la fin des itérations, on se trouve dans un endroit (un point dans l'espace à n dimensions où n représente le nombre de poids) qui est le minimum LOCAL de la fonction d'erreur dans cette espace à n dimensions. Il faut bien garder à l'esprit que cette règle de mise-à-jour des poids ne trouve qu'un minimum local à la fonction d'erreur. La solution trouvée n'est donc pas LA solution optimale mais une approximation.
Il y a un bouquin utilisé dans les cours d'intelligence artificielle: "Machine Learning" de Tom Mitchell (ISBN 0070428077). Le site du livre propose aussi des transparents comme base pour des cours: http://www.cs.cmu.edu/~tom/mlbook-chapter-slides.html. Le chapitre 4 devrait particulièrement t'intéresser je crois ;)
14 déc. 2005 à 19:17
Pour le paramétrage de ton réseau, il n'y a pas de règle absolue. Tout dépend ce que tu veux en faire. Le nombre de couches, le nombre de neurones par couches, etc. dépendent du type de résultat que tu veux obtenir. Mais il faut toujours garder à l'esprit l'efficacité du réseau : plus un réseau a de couches et/ou de neurones par couche, plus l'apprentissage et même le calcul du réseau, prennent du temps. A toi d'essayer de trouver le meilleur compromis rapidité/fiabilité de ton réseau suivant l'utilisation que tu souhaites en faire.
Très souvent, le nombre de couches n'excède pas 3. Plus de couches n'améliorent pas les performances du réseau ; cela peut même avoir l'effet inverse.
14 déc. 2005 à 16:41
Pour l'interface H-M en fait c parce que je ne voulais pas faire un prog de reseau de neurones complet mais juste calculer personnellement des coefs pour les adapter a mes besoin:c'est entre autre pour ca que ça n'accepte pas d'autre fichier pour les valeurs et que je n'ai pas trouvé utile de verifier qu'on ne mette pas une donnée incorecte genre un char.
Merci Vdust pour tes critiques et surtout celle concernant la gestion de la memoire de l'ordi.Sinon quel genre de fonctions a tu reussi a faire apprendre et quel nombre de couche a tu utilisé car c'est sur la maniere de bien parametrer un rdn que j'ai des lacunes(et aussi sur comment optimiser mon algorithme d'apprentissage).
Sinon Dominion si tu veux utiliser le programme tu dois avant dans les souces mettre NB_EX a la valeur nombre d'exemple que tu veux presenter, KPRECISION doit etre réglé sur la precision du resultat que tu veux obtenir et sinon tu met un nombre suffisant de coef dans le fichier coef.txt ,sachant que chaque neurone d'une couche est reliée a tous les neurones de la couche suivante.Et enfin dans le fichier entree.txt tu met les valeurs d'entrée et dans le fichier sortie.txt les valeurs de sortie correspondantes et en conservant le meme ordre.Voilà tout .
13 déc. 2005 à 23:35
13 déc. 2005 à 18:49
Certaines intelligences artificielles de jeux se servent également de réseaux de neurones.
Chose amusante à tester, on peut aussi faire de la compression d'images avec un perceptron multicouches...
13 déc. 2005 à 13:39
Tu n'aurais pas une ou deux url (ou livre) à me conseiller ?
Au fait, je suppose que ça vient de moi, mais ton programme foire lorsque je fais un apprentissage... Ca serait super si tu écrivait une petite doc sur comment utiliser ton code, et aussi une application pratique de ton algo (je ne sais pas trop si dans le cas des réseaux de neurones il y ai vraiment un réseau designé en fonction de l'application, enfin j'avais compris que c'était assez abstrait et général)
13 déc. 2005 à 04:11
Ce qui est dommage, c'est que la classe 'reseau' soit aussi liée à l'interface Homme-Machine : les tâches comme la demande d'informations à l'utilisateur, la lecture des données d'un fichier, etc., je les aurais personnellement laissé au 'main', en passant les données récupérées en arguments aux fonctions de la classe. Par exemple, le réseau lit des fichiers prédéfinis : mais un programme utilisant tes classes peut avoir besoin de passer des données d'apprentissage lues dans un autre format de fichier, ou demandées directement à l'utilisateur du programme.
De plus, et je trouve qu'il y a ici une bonne habitude à prendre (et à moindre effort) lorsqu'on veut écrire un code portable, ça serait encore plus clair si chaque classe était définie dans un fichier différent, en utilisant des headers pour les déclarations. Avec une telle structure, le code serait plus facilement réutilisable et te permettrait aussi de mieux voir où doit s'arrêter le rôle de chaque classe.
Sinon, il y a une très grosse optimisation à faire au niveau de tes couches. La séparation en réseau/couches/neurones est une conception très "visuelle". Mais si l'on se place au niveau de la mémoire de l'ordinateur, on constate que les neurones d'une même couche sont éparpillés (chaque neurone étant créé par une instruction "new"), ce qui est catastrophique en terme de temps d'accès aux différents neurones, accès qui sont extrêmements fréquents lors de la rétropropagation ( à la récupération des valeurs des neurones d'une autre couche pour chaque neurone de la couche.). Même si d'un point de vue conceptuel, la séparation est élégante, d'un point de vue calculatoire, il est préférable de "fusionner" le concept de neurone à la classe "couche", en créant des tableaux pour chaque propriété des neurones. Comme dans ce cas, les différentes valeurs se suivent en mémoire, les accès sont beaucoups plus rapide, et le temps d'apprentissage en est très sévèrement amélioré.
Malgré toutes ces critiques, bravo pour ton programme, qui, même si l'interface H-M ne gère aucune erreur de saisie au clavier (entre autres, un caractère non prévu (comme 'a', que j'ai malencontreusement tapé à la place de '1') fait boucler le programme), a le mérite de fonctionner correctement.