From 5756a7a8d6f35f898dbe63d6340242828c1fd65f Mon Sep 17 00:00:00 2001 From: augustin64 Date: Mon, 28 Mar 2022 16:52:17 +0200 Subject: [PATCH 1/2] Ajout lecture reseau depuis fichier --- src/mnist/neuron_io.c | 69 ++++++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/src/mnist/neuron_io.c b/src/mnist/neuron_io.c index be436f5..cbc9c11 100644 --- a/src/mnist/neuron_io.c +++ b/src/mnist/neuron_io.c @@ -8,23 +8,54 @@ #define MAGIC_NUMBER 2023 -/* -Neurone* lire_neurones(uint32_t nb_neurones, uint32_t nb_poids_sortants) { - // le malloc dépend en fait du nombre de neurones de la couche suivante, - // il faut donc rentrer plus en détails sur la taille de l'allocation - Neurone* tab = malloc(sizeof(Neurone)*nb_neurones); - return tab; + +Neurone* lire_neurone(uint32_t nb_poids_sortants, FILE *ptr) { + Neurone* neurone = malloc(sizeof(float)*(6+2*nb_poids_sortants)); + float activation; + float biais; + float poids_sortants[nb_poids_sortants]; + + fread(&activation, sizeof(float), 1, ptr); + fread(&biais, sizeof(float), 1, ptr); + fread(&poids_sortants, sizeof(float)*nb_poids_sortants, 1, ptr); + + neurone->activation = activation; + neurone->biais = biais; + + neurone->z = 0.0; + neurone->dactivation = 0.0; + neurone->dbiais = 0.0; + neurone->dz = 0.0; + + for (int i=0; i < nb_poids_sortants; i++) { + neurone->poids_sortants[i] = poids_sortants[i]; + neurone->dw[i] = 0.0; + } + + return neurone; +} + + +// Lit une couche de neurones +Neurone** lire_neurones(uint32_t nb_neurones, uint32_t nb_poids_sortants, FILE *ptr) { + Neurone** neurones = malloc(sizeof(Neurone*)*nb_neurones); + + for (int i=0; i < nb_neurones; i++) { + neurones[i] = lire_neurone(nb_poids_sortants, ptr); + } + return neurones; } // Charge l'entièreté du réseau neuronal depuis un fichier binaire -Couche* lire_reseau(char* filename) { +Reseau* lire_reseau(char* filename) { FILE *ptr; - Reseau* reseau = malloc(sizeof(int)+sizeof(Couche*)); + Reseau* reseau = malloc(sizeof(int)+sizeof(Couche**)); ptr = fopen(filename, "rb"); uint32_t magic_number; uint32_t nb_couches; + reseau->nb_couches = nb_couches; fread(&magic_number, sizeof(uint32_t), 1, ptr); if (magic_number != MAGIC_NUMBER) { @@ -35,22 +66,26 @@ Couche* lire_reseau(char* filename) { fread(&nb_couches, sizeof(uint32_t), 1, ptr); - Couche* couches = malloc((sizeof(int)+sizeof(Neurone*)*nb_couches)); - uint32_t nb_neurones_couche[nb_couches]; + Couche** couches = malloc(sizeof(Couche*)*nb_couches); + uint32_t nb_neurones_couche[nb_couches+1]; - reseau->couche = couches; + reseau->couches = couches; - fread(&nb_neurones_couche, sizeof(nb_neurones_couche), 1, ptr); + fread(&nb_neurones_couche, sizeof(nb_neurones_couche)-sizeof(uint32_t), 1, ptr); + nb_neurones_couche[nb_couches] = 0; - for (int i=0; i < nb_couches+1; i++) { - couches[i].nb_neurone = nb_neurones_couche[i]; - couches[i].neurone = lire_neurones(couches[i].nb_neurone, nb_neurones_couche[i+1]); + for (int i=0; i < nb_couches; i++) { + couches[i]->nb_neurones = nb_neurones_couche[i]; + } + + for (int i=0; i < nb_couches; i++) { + couches[i]->neurones = lire_neurones(couches[i]->nb_neurones, couches[i+1]->nb_neurones, ptr); } fclose(ptr); - return couches; + return reseau; } -*/ + // Écrit un neurone dans le fichier pointé par *ptr From 79609f4687eb473074b19f3a737d757d5e61cd63 Mon Sep 17 00:00:00 2001 From: augustin64 Date: Mon, 28 Mar 2022 18:03:10 +0200 Subject: [PATCH 2/2] Ajout lecture reseau depuis fichier --- src/mnist/neuron_io.c | 32 ++++++++++++++++++++------------ test/neuron_io.c | 1 + 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/mnist/neuron_io.c b/src/mnist/neuron_io.c index cbc9c11..a2eb602 100644 --- a/src/mnist/neuron_io.c +++ b/src/mnist/neuron_io.c @@ -10,14 +10,13 @@ Neurone* lire_neurone(uint32_t nb_poids_sortants, FILE *ptr) { - Neurone* neurone = malloc(sizeof(float)*(6+2*nb_poids_sortants)); + Neurone* neurone = malloc(sizeof(Neurone)); float activation; float biais; - float poids_sortants[nb_poids_sortants]; + float tmp; fread(&activation, sizeof(float), 1, ptr); fread(&biais, sizeof(float), 1, ptr); - fread(&poids_sortants, sizeof(float)*nb_poids_sortants, 1, ptr); neurone->activation = activation; neurone->biais = biais; @@ -27,8 +26,14 @@ Neurone* lire_neurone(uint32_t nb_poids_sortants, FILE *ptr) { neurone->dbiais = 0.0; neurone->dz = 0.0; + float* poids_sortants = malloc(sizeof(float)*nb_poids_sortants); + + neurone->dw = malloc(sizeof(float)*nb_poids_sortants); + neurone->poids_sortants = poids_sortants; + for (int i=0; i < nb_poids_sortants; i++) { - neurone->poids_sortants[i] = poids_sortants[i]; + fread(&tmp, sizeof(float), 1, ptr); + neurone->poids_sortants[i] = tmp; neurone->dw[i] = 0.0; } @@ -39,22 +44,23 @@ Neurone* lire_neurone(uint32_t nb_poids_sortants, FILE *ptr) { // Lit une couche de neurones Neurone** lire_neurones(uint32_t nb_neurones, uint32_t nb_poids_sortants, FILE *ptr) { Neurone** neurones = malloc(sizeof(Neurone*)*nb_neurones); - for (int i=0; i < nb_neurones; i++) { neurones[i] = lire_neurone(nb_poids_sortants, ptr); } return neurones; } + // Charge l'entièreté du réseau neuronal depuis un fichier binaire Reseau* lire_reseau(char* filename) { FILE *ptr; - Reseau* reseau = malloc(sizeof(int)+sizeof(Couche**)); + Reseau* reseau = malloc(sizeof(Reseau)); ptr = fopen(filename, "rb"); uint32_t magic_number; uint32_t nb_couches; + uint32_t tmp; reseau->nb_couches = nb_couches; fread(&magic_number, sizeof(uint32_t), 1, ptr); @@ -71,15 +77,16 @@ Reseau* lire_reseau(char* filename) { reseau->couches = couches; - fread(&nb_neurones_couche, sizeof(nb_neurones_couche)-sizeof(uint32_t), 1, ptr); + for (int i=0; i < nb_couches; i++) { + couches[i] = malloc(sizeof(int)+sizeof(Neurone**)); + fread(&tmp, sizeof(tmp), 1, ptr); + couches[i]->nb_neurones = tmp; + nb_neurones_couche[i] = tmp; + } nb_neurones_couche[nb_couches] = 0; for (int i=0; i < nb_couches; i++) { - couches[i]->nb_neurones = nb_neurones_couche[i]; - } - - for (int i=0; i < nb_couches; i++) { - couches[i]->neurones = lire_neurones(couches[i]->nb_neurones, couches[i+1]->nb_neurones, ptr); + couches[i]->neurones = lire_neurones(couches[i]->nb_neurones, nb_neurones_couche[i+1], ptr); } fclose(ptr); @@ -88,6 +95,7 @@ Reseau* lire_reseau(char* filename) { + // Écrit un neurone dans le fichier pointé par *ptr void ecrire_neurone(Neurone* neurone, int poids_sortants, FILE *ptr) { float buffer[poids_sortants+2]; diff --git a/test/neuron_io.c b/test/neuron_io.c index 3adf199..9ce00ac 100644 --- a/test/neuron_io.c +++ b/test/neuron_io.c @@ -61,5 +61,6 @@ Reseau* creer_reseau(int nb_couches, int nb_max_neurones, int nb_min_neurones) { int main() { Reseau* reseau = creer_reseau(5, 300, 10); ecrire_reseau(".test-cache/neuron_io.bin", reseau); + Reseau* reseau2 = lire_reseau(".test-cache/neuron_io.bin"); return 1; } \ No newline at end of file