Accueil > > > BIEN EXPLIQUE: EXEMPLE DE RESEAU DE NEURONE
BIEN EXPLIQUE: EXEMPLE DE RESEAU DE NEURONE
Information sur la source
Description
il s'agit d'un réseau de neurone qui ne fait que approximer xor exponentielle carré produit somme les explications sur l'algortihme de base du réseau de neurone: http://www.hacking.free.fr/paris8/Backpropagation .htm l'intéret est que j'ai écrit 3 pages pour expliquer comment il fonctione, car j'ai dû faire un vrai travail de détective pour réussir à le programmer notatement je me suis servi d'une source qui marchait bien pour le xor (c'est pas courrant !) ******** pour la détection de lettres : comme vous pouvez le voir dans le screenshot les résultats sont déja amusants avec seulement 5 exemples "bruités" avec un random
Source
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
typedef double mlp_float;
typedef struct {
mlp_float *poids_synaptique;
mlp_float *valeur_neurone;
mlp_float *valeur_erreur_neurone;
mlp_float *neurone_entree;
mlp_float *neurone_sortie;
mlp_float *valeur_erreur_sortie;
int *index_couche;
int *taille_couche;
int *index_synapse;
int nombre_couche;
int nombre_neurone;
int nombre_synapse;
int taille_couche_entree;
int taille_couche_sortie;
} mlp;
static mlp_float MAGICAL_WEIGHT_NUMBER = 1.0f;
static mlp_float MAGICAL_LEARNING_NUMBER = 0.09f;
mlp *create_mlp(int nombre_couche, int *taille_couche) {
mlp *reseau = malloc(sizeof * reseau);
reseau->nombre_couche = nombre_couche;
reseau->taille_couche = malloc(sizeof * reseau->taille_couche * reseau->nombre_couche);
reseau->index_couche = malloc(sizeof * reseau->index_couche * reseau->nombre_couche);
int i;
reseau->nombre_neurone = 0;
for (i = 0; i < nombre_couche; i++) {
reseau->taille_couche[i] = taille_couche[i];
reseau->index_couche[i] = reseau->nombre_neurone;
reseau->nombre_neurone += taille_couche[i];
}
reseau->valeur_neurone = malloc(sizeof * reseau->valeur_neurone * reseau->nombre_neurone);
reseau->valeur_erreur_neurone = malloc(sizeof * reseau->valeur_erreur_neurone * reseau->nombre_neurone);
reseau->taille_couche_entree = taille_couche[0];
reseau->taille_couche_sortie = taille_couche[nombre_couche-1];
reseau->neurone_entree = reseau->valeur_neurone;
reseau->neurone_sortie = &reseau->valeur_neurone[reseau->index_couche[nombre_couche-1]];
reseau->valeur_erreur_sortie = &reseau->valeur_erreur_neurone[reseau->index_couche[nombre_couche-1]];
reseau->index_synapse = malloc(sizeof * reseau->index_synapse * (reseau->nombre_couche-1));
reseau->nombre_synapse = 0;
for (i = 0; i < nombre_couche - 1; i++) {
reseau->index_synapse[i] = reseau->nombre_synapse;
reseau->nombre_synapse += (reseau->taille_couche[i]+1) * reseau->taille_couche[i+1];
}
reseau->poids_synaptique = malloc(sizeof * reseau->poids_synaptique * reseau->nombre_synapse);
for (i = 0; i < reseau->nombre_synapse; i++) {
reseau->poids_synaptique[i] = MAGICAL_WEIGHT_NUMBER * (mlp_float)rand() / RAND_MAX - MAGICAL_WEIGHT_NUMBER/2;
}
return reseau;
}
void free_mlp (mlp *reseau) {
free(reseau->taille_couche);
free(reseau->index_couche);
free(reseau->valeur_neurone);
free(reseau->valeur_erreur_neurone);
free(reseau->index_synapse);
free(reseau->poids_synaptique);
free(reseau);
}
void set_mlp (mlp * reseau, mlp_float *vecteur) {
if (vecteur != NULL) {
int i;
for (i = 0; i < reseau->taille_couche_entree; i++) {
reseau->neurone_entree[i] = vecteur[i];
}
}
int i;
int index_synapse;
index_synapse = 0;
for (i = 1; i < reseau->nombre_couche; i++) {
int j;
for (j = reseau->index_couche[i]; j < reseau->index_couche[i] + reseau->taille_couche[i]; j++) {
mlp_float somme_ponderee = 0.0;
int k;
for (k = reseau->index_couche[i-1]; k < reseau->index_couche[i-1] + reseau->taille_couche[i-1]; k++) {
somme_ponderee += reseau->valeur_neurone[k] * reseau->poids_synaptique[index_synapse];
index_synapse++;
}
somme_ponderee += reseau->poids_synaptique[index_synapse];
index_synapse++;
reseau->valeur_neurone[j] = somme_ponderee;
if (i != reseau->nombre_couche - 1) reseau->valeur_neurone[j] = tanh(reseau->valeur_neurone[j]);
}
}
}
void get_mlp (mlp *reseau, mlp_float *vecteur) {
int i;
for (i = 0; i < reseau->taille_couche_sortie; i++) {
vecteur[i] = reseau->neurone_sortie[i];
}
}
void learn_mlp (mlp *reseau, mlp_float *desired_out) {
int i;
mlp_float global_error = 0;
int index_synapse = reseau->index_synapse[reseau->nombre_couche-2];
for (i = 0; i < reseau->taille_couche_sortie; i++) {
reseau->valeur_erreur_sortie[i] = reseau->neurone_sortie[i] - desired_out[i];
int j;
for (j = reseau->index_couche[reseau->nombre_couche-2]; j < reseau->index_couche[reseau->nombre_couche-2] + reseau->taille_couche[reseau->nombre_couche-2]; j++) {
mlp_float weightChange;
weightChange = MAGICAL_LEARNING_NUMBER * reseau->valeur_erreur_sortie[i] * reseau->valeur_neurone[j];
reseau->poids_synaptique[index_synapse] -= weightChange;
if (reseau->poids_synaptique[index_synapse] > 5) reseau->poids_synaptique[index_synapse] = 5;
if (reseau->poids_synaptique[index_synapse] < -5) reseau->poids_synaptique[index_synapse] = -5;
index_synapse++;
}
mlp_float weightChange;
weightChange = MAGICAL_LEARNING_NUMBER * reseau->valeur_erreur_sortie[i];
reseau->poids_synaptique[index_synapse] -= weightChange;
if (reseau->poids_synaptique[index_synapse] > 5) reseau->poids_synaptique[index_synapse] = 5;
if (reseau->poids_synaptique[index_synapse] < -5) reseau->poids_synaptique[index_synapse] = -5;
index_synapse++;
}
for (i = reseau->nombre_couche - 2; i > 0; i--) {
int j;
int jj= 0;
int index_synapse = reseau->index_synapse[i-1];
for (j = reseau->index_couche[i]; j < reseau->index_couche[i] + reseau->taille_couche[i]; j++,jj++) {
int k;
int index_synapse2 = reseau->index_synapse[i] + jj;
reseau->valeur_erreur_neurone[j] = 0;
for (k = reseau->index_couche[i+1]; k < reseau->index_couche[i+1] + reseau->taille_couche[i+1]; k++) {
reseau->valeur_erreur_neurone[j] += reseau->poids_synaptique[index_synapse2] * reseau->valeur_erreur_neurone[k];
index_synapse2+=reseau->taille_couche[i]+1;
}
for (k = reseau->index_couche[i-1]; k < reseau->index_couche[i-1] + reseau->taille_couche[i-1]; k++) {
mlp_float weightChange;
weightChange = 1.0 - reseau->valeur_neurone[j] * reseau->valeur_neurone[j];
weightChange *= reseau->valeur_erreur_neurone[j] * MAGICAL_LEARNING_NUMBER;
weightChange *= reseau->valeur_neurone[k];
reseau->poids_synaptique[index_synapse] -= weightChange;
index_synapse++;
}
mlp_float weightChange;
weightChange = 1.0 - reseau->valeur_neurone[j] * reseau->valeur_neurone[j];
weightChange *= reseau->valeur_erreur_neurone[j] * MAGICAL_LEARNING_NUMBER;
reseau->poids_synaptique[index_synapse] -= weightChange;
index_synapse++;
}
}
}
Conclusion
les main sont dans le zip
Historique
- 23 avril 2007 16:46:59 :
- je sais pas je m'étais trompé de version d'un des fichiers
- 23 avril 2007 21:48:15 :
- juste un fichier avec quelques lettres 5x3 pixels
- 23 avril 2007 21:59:58 :
- passage à 100000 itérations pour détecter les lettres A B C D E majuscules
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Intelligence Artificielle [ par JCpp ]
Concours IA (Intelligence Artificielle) [ par ynizon ]
Je suis a la recherche de participants pour un ptit jeu sympa qui ressemble aux dames chinoises. Le but etant que chacun developpe sa propre IA, et l'
Intelligence Artificielle... [ par kojiro2 ]
Coucou tout le monde,J'aurai bien aimé connaitre de bons sites sur l'IA. En effet je ne trouve rien d'exeptionnel sur le net. Ya pas des sites sympas
Esce que je peux utiliser le c++ pour programmer l'intelligence artificielle d'un robot? [ par Uims ]
tout est dans la question...merciUims
intelligence artificielle pour jeu 2d à la mario bros [ par StrikerFred ]
bonjour, je fais un jeu 2d mais avec une vue style mario (profil)donc y'aura des ennemis, et j'aimerais qu'ils se dirigent vers le héros, cad qu'
Projet : Réalisation d'une intelligence artificielle aux échecs. [ par manta7 ]
Bonjour à tous, je souhaite réaliser une IA aux échecs, pour le moment, le projet est assez floue mais si cela vous tente : manta7 arob
Projet en Intelligence Artificielle [ par manta7 ]
Salut à tous, Développeur en C (et finaliste de Prologin ), je recherche des personnes qui veulent participer à un projet de programmation sur le thè
Intelligence artificielle [ par Alice89 ]
Bonjour Nous sommes deux étudiantes en informatique et cherc
Ecole d'intelligence artificielle [ par eldiablomortal ]
Bonjour voila je suis actuellement en BTS informatique de gestion option developpeur. J'envisage de poursuivre mes etudes. Et je voudrais essayer l'in
apprentissage avec reseau de neurone [ par resau ]
bonsoir, j'ai un problème dans le vecteur caractéristique de réseau de neurone comment l'adapter a mes donnés ,qui sont une matrice qui contient le va
|
Derniers Blogs
TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVéTECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVé par ROMELARD Fabrice
Speaker : Guillaume Rochette Cette session est dédiée à fournir le retour sur la mise en place d'un cloud privé (IaaS) par Osiatis pour son compte ou celui de ses clients. Ce projet s'est déroulé sur 4 mois et a permis de faire évoluer...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|