/*--------------------------------------------------- ------------------------TO Do------------------------ ---------------------------------------------------*/ //Creation des structures ::::::::::::::::::::::::::: //Creation des variables pour le réseaux neuronal ::: //Initialisation des variables //Froward propagation //Bakcward propagation //Entrainement à partir de données //Sauvegarde des poids dans un fichier binaire //Free tout le réseau neuronal :::::::::::::::::::::: /*--------------------------------------------------- --------------------Bibliothèques-------------------- ---------------------------------------------------*/ #include #include #include #include #include #define TAUX_APPRENTISSAGE 0.15 //Définit le taux d'apprentissage du réseau neuronal, donc la rapadité d'adaptation du modèle (comprit ent 0 et 1) //<> Le nombre de couche doit être supérieur à 2 /*--------------------------------------------------- -----------------------Macros---------------------- ---------------------------------------------------*/ /*--------------------------------------------------- ----------------------Structure---------------------- ---------------------------------------------------*/ typedef struct neurone_struct{ float activation; //Caractérise l'activation du neurone float* poids_sortants; //Liste de tous les poids des arêtes sortants du neurone float biais; //Caractérise le biais du neurone float z; //Sauvegarde des calculs faits sur le neurone (programmation dynamique) float dactivation; float *dw; float dbiais; float dz; } neurone_struct; typedef struct couche_struct{ int nb_neurone; //Nombre de neurones dans la couche (longueur de la liste ci-dessous) neurone_struct* neurone; //Liste des neurones dans la couche } couche_struct; /*--------------------------------------------------- ----------------------Fonctions---------------------- ---------------------------------------------------*/ couche_struct* reseau_neuronal; void creation_du_reseau_neuronal(int nb_couches, int* neurones_par_couche); void suppression_du_reseau_neuronal(int nb_couches, int* neurones_par_couche); void forward_propagation(int nb_couches, int* neurones_par_couche); int* creation_de_la_sortie_voulue(int nb_couches, int* neurones_par_couche, int pos_nombre_voulu); void backward_propagation(int nb_couches, int* neurones_par_couche, int* sortie_voulue); void modification_du_reseau_neuronal(int nb_couches, int* neurones_par_couche); void initialisation_du_reseau_neuronal(int nb_couches, int* neurones_par_couche); void creation_du_reseau_neuronal(int nb_couches, int* neurones_par_couche) { /* Créé les différentes variables dans la variable du réseau neuronal à partir du nombre de couche et de la liste du nombre de neurone par couche */ reseau_neuronal = (couche_struct*)malloc(sizeof(couche_struct)*nb_couches); //Création des différentes couches for (int i=0; i0; i--) { // On remonte les couche de l'avant dernière jusqu'à la première for(int j=0; j= 0) // ??? ... reseau_neuronal[i].neurone[j].dz = reseau_neuronal[i].neurone[j].dactivation; else // ??? ... reseau_neuronal[i].neurone[j].dz = 0; for(int k=0; k1) // ??? ... reseau_neuronal[i-1].neurone[k].dactivation = reseau_neuronal[i-1].neurone[k].poids_sortants[j] * reseau_neuronal[i].neurone[j].dz; } reseau_neuronal[i].neurone[j].dbiais = reseau_neuronal[i].neurone[j].dz; // ??? ... } } } void modification_du_reseau_neuronal(int nb_couches, int* neurones_par_couche) { /* Modifie les poids et le biais des neurones du réseau neuronal à partir du nombre de couches et de la liste du nombre de neurone par couche */ for (int i=0; i0) // Pour tous les neurones n'étant pas dans la première couche reseau_neuronal[i].neurone[j].biais = borne_inferieure + ((double)rand())/((double)RAND_MAX)*(borne_superieure - borne_inferieure); // On initialise le biais aléatoirement } } double borne_superieure = 1/sqrt(neurones_par_couche[nb_couches-1]); double borne_inferieure = - borne_superieure; for (int j=0; j