Ajout lecture reseau depuis fichier

This commit is contained in:
augustin64 2022-03-28 16:52:17 +02:00
parent 9399908ea3
commit 5756a7a8d6

View File

@ -8,23 +8,54 @@
#define MAGIC_NUMBER 2023 #define MAGIC_NUMBER 2023
/*
Neurone* lire_neurones(uint32_t nb_neurones, uint32_t nb_poids_sortants) { Neurone* lire_neurone(uint32_t nb_poids_sortants, FILE *ptr) {
// le malloc dépend en fait du nombre de neurones de la couche suivante, Neurone* neurone = malloc(sizeof(float)*(6+2*nb_poids_sortants));
// il faut donc rentrer plus en détails sur la taille de l'allocation float activation;
Neurone* tab = malloc(sizeof(Neurone)*nb_neurones); float biais;
return tab; 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 // Charge l'entièreté du réseau neuronal depuis un fichier binaire
Couche* lire_reseau(char* filename) { Reseau* lire_reseau(char* filename) {
FILE *ptr; FILE *ptr;
Reseau* reseau = malloc(sizeof(int)+sizeof(Couche*)); Reseau* reseau = malloc(sizeof(int)+sizeof(Couche**));
ptr = fopen(filename, "rb"); ptr = fopen(filename, "rb");
uint32_t magic_number; uint32_t magic_number;
uint32_t nb_couches; uint32_t nb_couches;
reseau->nb_couches = nb_couches;
fread(&magic_number, sizeof(uint32_t), 1, ptr); fread(&magic_number, sizeof(uint32_t), 1, ptr);
if (magic_number != MAGIC_NUMBER) { if (magic_number != MAGIC_NUMBER) {
@ -35,22 +66,26 @@ Couche* lire_reseau(char* filename) {
fread(&nb_couches, sizeof(uint32_t), 1, ptr); fread(&nb_couches, sizeof(uint32_t), 1, ptr);
Couche* couches = malloc((sizeof(int)+sizeof(Neurone*)*nb_couches)); Couche** couches = malloc(sizeof(Couche*)*nb_couches);
uint32_t nb_neurones_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++) { for (int i=0; i < nb_couches; i++) {
couches[i].nb_neurone = nb_neurones_couche[i]; couches[i]->nb_neurones = 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]->neurones = lire_neurones(couches[i]->nb_neurones, couches[i+1]->nb_neurones, ptr);
} }
fclose(ptr); fclose(ptr);
return couches; return reseau;
} }
*/
// Écrit un neurone dans le fichier pointé par *ptr // Écrit un neurone dans le fichier pointé par *ptr