Reseaux neuronaux : modele de hopfield

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 400 fois - Téléchargée 30 fois

Contenu du snippet

Une classe qui peut-etre utiliser pour simuler un reseaux de Hopfield (tous les neurones sont connecter a tous les autres)

Un reseau de neurone comme celui de Hopfield sert normalement a faire de la reconnaisance de forme (apres lui avoir appris ce qu'est un 1, un 2 , ... le programme peu reconnaitre des 1 , des 2 manuscrit assez proche du modele appris (comme dans les Palms)).

pas encore de ZIP mais sa va venir !!

Source / Exemple :


//Hopfield.h

#include <stdlib.h> //pour calloc

//definition d'un neurone (08/01/04 19:22)
class Hopfield
{
private:

#define egal(a,b) (a == b ? 1 : -1) //1 si egaux -1 si different
#define T(a) (a<0 ? -1 : 1)	//signe

int** poids; //poids associer entre les neurones i & j : "poids[i][j]" 

public:

int* sortie;
int nb_neurone;

//fonction du reseau
void Apprendre(int** Modele,int nb_modele); //apprendre une series de modeles
void Definir(int nb_neurone); //initialise tous les poids a 0
void Calcul_Sortie(int* entree);

};//fin de la class Hopfield

void Hopfield::Apprendre(int** Modele,int nb_modele) //apprendre une series de modeles
{
for (int i = 0; i< nb_neurone; i++)
for (int j = 0; j<nb_neurone; j++) //ttes les liaisons
for (int k=0; k<nb_modele; k++){ //ts les modeles
if (i==j)
poids[i][j]=0;
else
poids[i][j]+= egal(Modele[k][i],Modele[k][j]);
}
}

void Hopfield::Definir(int nb_neurone) //initialise tous les poids a 0
{

int i;
Hopfield::nb_neurone=nb_neurone;

free (poids);
free(sortie);

poids = (int**) calloc(nb_neurone,sizeof(int*));
sortie = (int*) calloc(nb_neurone,sizeof(int));

for (i=0; i<nb_neurone; i++)
poids[i]= (int*) calloc(nb_neurone-i,sizeof(int)); 

for (i = 0; i< nb_neurone; i++)
for (int j = 0; j<nb_neurone; j++) //ttes les liaisons
poids[i][j]=0; 
}

void Hopfield::Calcul_Sortie(int* entree)
{
int modif = true;
int* temp;

temp =(int*)calloc(nb_neurone,sizeof(int));

for (int i = 0 ; i<nb_neurone;i++)
{
sortie[i]=entree[i];
temp[i]=0;
}

while (modif !=false) //tant que l'on a pas atteint un etat stable
{
modif = false;

for (int i= 0 ; i<nb_neurone; i++)
{
for (int j = 0 ; j<nb_neurone ; j++)
{
temp[j]+=poids[i][j] * sortie[j];
}
}//etape Calcule
for (int i=0; i<nb_neurone; i++)
if (sortie[i]!=T(temp[i]))
{
sortie[i]=temp[i];
modif=true;
}
}//etat stable trouver ?
}

Conclusion :


Pour utiliser cette classe :

#include <Hopfield.h>

//pour crée le reseau :
Hopfield Nom_du_reseau(nombre_de_neurone);

Nom_du_reseau.initialise();

//pour lui apprendre un ou plusieur modele:
Nom_du_reseau.Apprendre(modeles_a_apprendre, nombre de modeles);

//pour calculer sa sortie
Nom_du_reseau.Calcul_Sortie(entree_du_reseau);

//La forme des entrée ,sortie est:
int* soit entrée[nombre_de_neurone]
sortie[nombre_de_neurone]

//la forme des modeles est:
int** soit modele[nombre_de_modele][nombre_de_neurone]

ATT: un reseau de Hopfield ne peut pas memoiriser plus de 0.13*nombre_de_neurone modeles sinon il devient "amnesique"

Voila je crois que tout est dit !!

PS: Ce code est le sujet de mon TPE de SI merci de me le dire si vous y voyez des erreurs !

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
16 mars 2008

serai il possible d'avoir un petit sample tout simple montrant comment on l'utilise car je galère un peu...
Merci
Messages postés
3
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
11 avril 2007

Bonjour,

Je cherche a voir si je peut utiliser le reseau de neurone pour resoudre un probleme d'effectation de ressource. Si c'est possible, informer moi sur la methode a suivre.

Merci!
Messages postés
1
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
24 août 2006

Salut,

Je cherche du code pour un réseau de Hopfield A VALEURS CONTINUES..
Absolument introuvable sur le net apparemment !
Code Python préféré, mais vu la rareté du truc je ne ferai pas le diffiçile.

Si quelqu'un connaît un lien? Merci!
Messages postés
9
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
10 mars 2011

Salut,
Ce programme est très interessant, mais comme tu le fais remarqué, assez limité.
Je travaille sur des images de 640*480 en NDG, dc ce type de prog n'est pas utile ici.

Je me tente le perceptron, mais c'est plus dure.

Et t'en es où toi avec lui ?
Messages postés
1
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
26 février 2006

Ce code n'est pas très exact, en effet il boucle pour ne jamais converger.
Afficher les 23 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.