diff --git a/src/neural_network.c b/src/neural_network.c new file mode 100644 index 0000000..a9e7351 --- /dev/null +++ b/src/neural_network.c @@ -0,0 +1,230 @@ +/*--------------------------------------------------- +------------------------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