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
comment extraire le SSID d'un reseau wifi? [ par sbsiam ]
Bonjour tout le monde;j'essay de faire une application simple qui affiche le SSID et la qualité du signale pou mon reseau WIFI. j'ai trouver une
|
Derniers Blogs
TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|