RNA (3 NEURONES ET 2 ENTRÉES) AVEC RÉTROPROPAGATION

ZogStriP Messages postés 164 Date d'inscription dimanche 16 novembre 2003 Statut Modérateur Dernière intervention 5 juillet 2005 - 22 janv. 2004 à 18:54
Revan012 Messages postés 2 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 15 août 2007 - 15 août 2007 à 10:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/19674-rna-3-neurones-et-2-entrees-avec-retropropagation

Revan012 Messages postés 2 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 15 août 2007
15 août 2007 à 10:04
Juste pour ceux qui se bataille sur la fonction d'activation: elle peut varié et depend de l'architecture du reseau, elle peu etre bipolaire ou pas (sur -1,1 ou 0,1) et les formules varie de toute facon. Pour la mise a jours des poids c'est pareils de plus certaine personne rajoute l'inertie dans la mise a jours des poids.
cs_moniteur Messages postés 4 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 22 décembre 2008
17 avril 2007 à 12:32
Super, enfin une application très simple de réseau de neurones clairement expliquée.

Par contre, je suis d'accord avec cedrigoler : A mon avis, c'est Deltas(3) = 2 * net3 * (1 - net3) * (Cible - net3)

Mais à part ça, rien à redire.
cs_raoullevert Messages postés 4 Date d'inscription mardi 21 novembre 2000 Statut Membre Dernière intervention 19 juillet 2006
16 sept. 2006 à 22:53
Sincerement, je trouve cette source super interessante. Je suis en train de coder(du moins j'essaye ! ) un systeme de naviguation autonome, basé sur une stereovision et un systeme neuronal, et je luttais un peu au niveau de l'algo de retropropagation :-)

Je pensais remplacer mon algo de correlation (mise en correspondance de 'zones' des image droites et gauches) par des chtis neurones, et ton programme m'aide ennormement.

En fait n'ayant pas de références au niveau de RN, je suis partis a coder une classe 'connection', une classe 'neurone', une classe 'couche', une classe 'reseau' qui sont finies d'ailleurs. Et il me manquais la retropopagation.(qui foire lamentablement chez moi)

Si ca interesse, je mettrais les sources (en python).


Juste pour Lost3d : Ce n'est pas parceque tu ne comprends pas les tenants et aboutissants d'un sujet que c'est forcement une chose ininteressante. Ceux qui ont essayé de faire du traitement d'image ou de son 'rééls' sont forcement confrontés au bruits et parasites. Le fait d'utiliser un reseau neuronal permet de creer un systeme assez robuste. Et puis tu n'es pas forcement obligé non plus d'envisager toutes les solutions possibles.
chakibvb Messages postés 2 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 15 juillet 2006
15 juil. 2006 à 12:55
pour l'auteur ....je dis bravo !!
c ce systeme qui est l avenir de l'informatique
salutation.............

@*-* +
Msgbox Messages postés 67 Date d'inscription lundi 1 juillet 2002 Statut Membre Dernière intervention 1 septembre 2006
2 juil. 2006 à 19:56
3 neuronnes... c'est presque plus intelligent qu'un footballer ça, non ?
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
6 déc. 2005 à 00:53
pour mieux cerner le sujet, j'essaie d'appliquer ton reseau de neurone a l'apprentissage d'une fonction de 2em degres (une bete parabole, ca peut aider aussi pour ceux qui ne voient toujours pas a quoi sert les reseaux de neurones). Du coup j'ai modif un peu ton module pour que le reseau prenne une seule entrée, et une couche de nbnc neurones cachés. mais j'arrive a un probleme: je prefere directement vous montrer le screen: http://img315.imageshack.us/img315/3413/sanstitre7ee.jpg

ya pas moyen de changer la fonction d'activation? j'ai essayé plusieurs, dont la tangente hyperbolique (en forme de sigmoide) avec:

Activation = (exp(value)-exp(-value))/(exp(value)+exp(-value))

mais sans succes ca fini toujours par partir en ...... puis depassement de capacité etc...

parce qu'avec une addition de deux sigmoides, on peut plus ou moins retrouver une partie de parabole ^_^

hum je vous post mon code. j'ai pas vraiment touché aux commentaires, puisque j'ai commencé ce prog ce soir, mais le code c'est deja ca :p

Option Explicit

'Cette variable est la valeur de combien est changé le poids de chauques neurones :
Const µ As Double = 0.5

Const nbnc = 2 '(+ 1 pour polarisation)

Public Poidss(1 To 3, 1 To 1 + nbnc) As Double

Public Function ChangeLesPoids()
'Cette fonction change les valeurs des poids avec une valeur aléatoire :
Dim i As Integer
Dim j As Integer
Randomize Timer
For i = 1 To 3
For j = 1 To 1 + nbnc
Poidss(i, j) = (Rnd * 2) - 1
Next j
Next i
End Function

Public Function Apprentissage(Entree1 As Double, Cible As Double)
'Cette fonction prend en argument 2 entrées et un résultat à atteindre (Cible)
'et "entraine" le réseau de neurones artificiels

'L'idée est de calculer la sortie du réseau à chaque fois, et en prenant en considération la "Cible",
'on utilise la 'rétropropagation' pour corriger la différence.

Dim Deltas(1 To 1 + nbnc) As Double
Dim net(1 To nbnc) As Double
Dim net3 As Double
Dim i As Integer
Dim valu As Double

'-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)

'Neurone n°1 : (d'entrée)
'Poidss(1,1) <=> poids du neurone n° 1 ou polarisation
'Poidss(2,1) <=> Entree1
'Poidss(3,1) <=> Entree2

'Neurone n°2 : (d'entrée)
'Poidss(1,2) <=> poids du neurone n° 2 ou polarisation
'Poidss(2,2) <=> Entree1
'Poidss(3,2) <=> Entree2

'Neurone n°3 (de sortie) :
'Poidss(1,3) <=> poids du neurone n° 3 ou X
'Poidss(2,3) <=> Neurone n°1 (net1)
'Poidss(3,3) <=> Neurone n°2 (net2)

'Calcule la valeur de chaques neurones de la couche cachée :
For i = 1 To nbnc
net(i) = Activation(Poidss(1, i) + Entree1 * Poidss(2, i))
Next i

'Calcule la valeur du neurone de sortie :
valu = Poidss(3, 1)
For i = 1 To nbnc
valu = valu + net(i) * Poidss(3, i + 1)
Next i
net3 = Activation(valu)
'-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)-=)

'Rétropropagation :
'"Delta" est la valeur de l'erreur du neuronne de sortie par rapport à chaques neurones du réseau
'Il faut calculer les "delta"s pour les deux couches !
'C'est à dire qu'il faut calculer les erreurs en parcourant le réseau de
'la droite vers la gauche en partant de neuronne de sortie pour arriver
'au(x) neurone(s) caché(s).(C'est pourquoi nous partons du neurone n°3 (de sortie))

'Calcul de 'Delta' :
Deltas(1 + nbnc) = net3 * (1 - net3) * (Cible - net3)
For i = 1 To nbnc
Deltas(i) = net(i) * (1 - net(i)) * (Poidss(3, i + 1)) * (Deltas(1 + nbnc))
Next i

'Maintenant on change les poids en conséquence :
For i = 1 To nbnc
'On change donc les poids de chaques neurones cachés :
Poidss(1, i) = Poidss(1, i) + µ * 1 * Deltas(i) 'Polarisation
Poidss(2, i) = Poidss(2, i) + µ * Entree1 * Deltas(i)

'On change les poids du neurones de sortie :
Poidss(3, 1 + i) = Poidss(3, 1 + i) + µ * net(i) * Deltas(1 + nbnc)
Next i

'On change les poids du neurones de sortie :
Poidss(3, 1) = Poidss(3, 1) + µ * 1 * Deltas(1 + nbnc) 'X

'Permet de faire patienter sans bloquer completement le PC !
DoEvents
End Function

Public Function Teste(Entree1 As Double) As Double
'Cette fonction calcule simplement la valeur de chaques neurones
'et retourne la valeur du neurone de sortie :
Dim net3 As Double
Dim net(1 To nbnc) As Double
Dim i As Integer
Dim valu As Double

'Calcule la valeur de chaques neurones de la couche cachée :
For i = 1 To nbnc
net(i) = Activation(Poidss(1, i) + Entree1 * Poidss(2, i))
Next i

'Calcule la valeur du neurone de sortie :
valu = Poidss(3, 1)
For i = 1 To nbnc
valu = valu + net(i) * Poidss(3, i + 1)
Next i
net3 = Activation(valu) 'net3 est le neurone de sortie !

Teste = net3
End Function

'Permet d'améliorer l'apprentissage :
Private Function Activation(Value As Double)
Activation = (1 / (1 + Exp(Value * -1)))
End Function
LeDesassembleur Messages postés 64 Date d'inscription vendredi 21 décembre 2001 Statut Membre Dernière intervention 16 janvier 2009
25 mai 2005 à 11:08
Excellent travail !

Ayant récemment monté un site d'intelligence artificielle (puisque c'est là ma spécialité (personne n'est parfait)), j'apprécie ce genre de code.

Je vous invite d'ailleur à rendre visite à mon tout jeune site à l'adresse : http://in.silico.free.fr
malgré sa jeunesse , il compte déjà un membre de renommée pour le domaine des algorithmes evolutionnaires !
Si l'I.A. vous intéresse, vous y êtes tous les bienvenus !
Concernant la source en elle-même, son intérêt est effectivement de bien présenter de façon claire les principes de bases des réseaux neuronaux. Qui plus est le code est tres clair.
Vraiment un exemple !
ma note 10!
cedrigoler Messages postés 35 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 6 mai 2005
5 mai 2005 à 20:28
oulalalala j'ai parlé un peu trop vite !!
Bon daccord j'ai compris, quand tu écris
'Poidss(2,1) <=> Entree1
'Poidss(3,1) <=> Entree2
cela signifie en fait "poids de la branche qui sort de l'entree" c'est bien cela ?

Et pour ce qui est du Deltas(3) = 2 * net3 * (1 - net3) * (Cible - net3) ?
cedrigoler Messages postés 35 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 6 mai 2005
5 mai 2005 à 20:17
Salut !

Bon boulo et un code bien commenté merci !

Cependant il y a un element que je ne comprends pas :
Dans cette boucle :

For i = 1 To 2
Poidss(1, i) = Poidss(1, i) + µ * 1 * Deltas(i)
Poidss(2, i) = Poidss(2, i) + µ * Entree1 * Deltas(i)
Poidss(3, i) = Poidss(3, i) + µ * Entree2 * Deltas(i)
Next i

Poidss(2,i) et Poidss(3,1) ne correspondent-ils justement pas respectivement à Entree1 et Entree2 comme tu le precises plus haut ? Cela me semble curieux de modifier les valeurs d'entrées ! Je pense que " Poidss(1, i) = Poidss(1, i) + µ * 1 * Deltas(i) " suffi dans la boucle, en effet avec la retropropagation du gradient que tu utilises on ne cherche qu'a ajuster les poids (et tu precises plus haut que Poidss(1,i) represente le poids du neurone i)
De meme pour Poidss(2,3) et Poidss(3,3) qui sont apparement les valeurs connectés au troisieme neurone, c'est à dire les valeur que sortent les deux neuronnes de la couche précédente et qui se connecte à la couche suivante.
Cela dit ces modification ne changerons rien, à part optimiser ton code en retirant des calcules inutiles.

Ensuite, tu as fait une erreur en utilise la formule de la retropropagation du gradient :
Deltas(3) = net3 * (1 - net3) * (Cible - net3)
Il sagit de :
Deltas(3) = 2 * net3 * (1 - net3) * (Cible - net3)
En effet il a deux formules differentes a utiliser pour la couche de sortie et les autres (entrées et cachées).

Bonne continuation !
ZogStriP Messages postés 164 Date d'inscription dimanche 16 novembre 2003 Statut Modérateur Dernière intervention 5 juillet 2005 1
29 mai 2004 à 12:59
Moi aussi, à mes débuts (bien que je n'en soit pas trés loin), je me demandais à quoi pouvait donc servir un programme pareil....

Ce programme sert juste à montrer les bases des Réseaux de Neuronnes ( une des majeures partie de l'intelligence artificielle ) qui permettent de trouver une solution approchée à un problème plus ou moins bien défini ou un problème dont la résolution (exacte) est impossible de nos jours avec les configurations des pc actuels. C'est une approche différente de celle des algorithmes génétiques mais dont le but et l'idée ( à savoir : se baser sur la biologie, puisque nous nous pouvons résoudre trés facilement certains problèmes comme le problèmes du voyageur de commerce ) sont les mêmes.
Bien sûr, ce programme ne peut apprendre que de simples opérations, mais en créant un réseau avec plus de neurones et en utilisant des propriétées différentes, on peut par exemple facilement faire un programme OCR ( reconnaissance des caractères ) et puis évoluer vers la reconnaissance de formes, de visages et même d'expressions (sauf que là, c'est du haut niveau....).

Voilà, j'espere que vous avez compris à quoi peut servir un programme pareil.
Si vous avez des questions, n'hésitez pas !

(Je sais que j'ai mis longtemps à répondre, mais je n'avais plus internet....)
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007
19 mars 2004 à 19:20
moi aussi je suis intéressé :
ZogStrip pourrait-tu répondre en public sur cette même board à la question de l0st3d ? nous expliquer quel est le but de ton programme ? pourquoi peut-on dire qu'il est "intelligent" ?
l0st3d Messages postés 205 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 13 novembre 2009
10 févr. 2004 à 06:09
Ok, je suis pas un mega-crack des math mais je suis un bon codeur VB... personellement je trouve ton programme innutile et je voudrai vien savoir qu'est-ce que ton programme peut apprendre apart une série de chiffres...

Je dit pas sa parce que je pence que tu est un mauvais codeur mais j'aimerais bien que tu m'explique a quoi sa peut bien servir :)

Merci d'avance de me répondre (en message privé)

l0st3d
-------
Le Bug est entre la chaise et l'écran
ZogStriP Messages postés 164 Date d'inscription dimanche 16 novembre 2003 Statut Modérateur Dernière intervention 5 juillet 2005 1
27 janv. 2004 à 19:49
Derien néocracker !!
Elle est faite pour ça !

ZogStriP
neocracker Messages postés 35 Date d'inscription vendredi 7 février 2003 Statut Membre Dernière intervention 20 février 2009
26 janv. 2004 à 21:36
salut je voulais te dire que ta source est super
je m'en suis servi pour faire reseau de neurones 4 entrees et 1 sortie
je la publierais bientot sur vbfrance

merci pour ta source et @++

neocracker
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
23 janv. 2004 à 03:14
Bah donne plus de détail
ZogStriP Messages postés 164 Date d'inscription dimanche 16 novembre 2003 Statut Modérateur Dernière intervention 5 juillet 2005 1
22 janv. 2004 à 18:54
N'hésitez surtout pas à mettre des commentaires....
Rejoignez-nous