From 342b115c4f50402cbe30ad6f5e77c59f8b251959 Mon Sep 17 00:00:00 2001 From: mirimatcode Date: Sat, 8 Feb 2025 20:31:51 +0100 Subject: [PATCH] aggiunta serializzazione rete su file, l'intero dataset 1 e inserita funzione che tiene conto del tempo --- classificatore_singolo | Bin 22008 -> 22304 bytes classificatore_singolo.c | 58 +++++++++++++++++------ percettroni.h | 98 ++++++++++++++++++++++++++++++--------- 3 files changed, 119 insertions(+), 37 deletions(-) diff --git a/classificatore_singolo b/classificatore_singolo index de8a44b8649053bcd9e254e8aa52c6986b2b33fb..796096c2b2ad73350f025d019aafd4b4cac45363 100755 GIT binary patch delta 7522 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 TkRK_X8RAga+h~bjT$=QM0u1yD delta 4992 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 CyGC~a diff --git a/classificatore_singolo.c b/classificatore_singolo.c index c6e2138..0eae657 100644 --- a/classificatore_singolo.c +++ b/classificatore_singolo.c @@ -1,4 +1,5 @@ #include "visualizzatore.h" +#include #define NUM_LAYERS 4 @@ -21,6 +22,10 @@ byte get_out_corretto(byte); void stampa_layer_indirizzo(Layer*); void main() { + time_t tempo_epoche[MAX_EPOCHE]; + + double tempo_trascorso; + srand(time(NULL)); /* init_allegro(); @@ -44,27 +49,50 @@ void main() { Dataset set = *set_appoggio; free(set_appoggio); - ReteNeurale rete_neurale = inizializza_rete_neurale(NUM_LAYERS); - //inizializzo layer 0 - rete_neurale.layers[0] = inizializza_layer(PERCETTRONI_LAYER_0, INPUT_LAYER_0); - //inizializzo layer 1 - rete_neurale.layers[1] = inizializza_layer(PERCETTRONI_LAYER_1, INPUT_LAYER_1); - //inizializzo layer 2 - rete_neurale.layers[2] = inizializza_layer(PERCETTRONI_LAYER_2, INPUT_LAYER_2); - //inizializzo layer 3 - rete_neurale.layers[3] = inizializza_layer(PERCETTRONI_LAYER_3, INPUT_LAYER_3); - //inizializzo layer ULTIMO - //rete_neurale.layers[4] = inizializza_layer(PERCETTRONI_LAYER_4, INPUT_LAYER_4); + ReteNeurale rete_neurale; + ReteNeurale *puntatore_rete = caricaReteNeurale("rete_cifar_pesi.bin"); + if(puntatore_rete == NULL) { + rete_neurale = inizializza_rete_neurale(NUM_LAYERS); + //inizializzo layer 0 + rete_neurale.layers[0] = inizializza_layer(PERCETTRONI_LAYER_0, INPUT_LAYER_0); + //inizializzo layer 1 + rete_neurale.layers[1] = inizializza_layer(PERCETTRONI_LAYER_1, INPUT_LAYER_1); + //inizializzo layer 2 + rete_neurale.layers[2] = inizializza_layer(PERCETTRONI_LAYER_2, INPUT_LAYER_2); + //inizializzo layer 3 + rete_neurale.layers[3] = inizializza_layer(PERCETTRONI_LAYER_3, INPUT_LAYER_3); + //inizializzo layer ULTIMO + //rete_neurale.layers[4] = inizializza_layer(PERCETTRONI_LAYER_4, INPUT_LAYER_4); + } else { + rete_neurale = *puntatore_rete; + free(puntatore_rete); + printf("Caricate impostazioni rete neurale da file\n"); + } - printf("Numero immagini: %d\n", 1000); + printf("Numero immagini: %d\n", set.size); //ADDESTRAMENTO for(int i = 0; i < MAX_EPOCHE; i++) { - printf("Epoca %d\n", i); + time(&tempo_epoche[i]); + + if(i == 0) + printf("Epoca %d\n", i); + else { + time(&tempo_epoche[i]); + double tempo_trascorso_epoca = difftime(tempo_epoche[i], tempo_epoche[i-1]); + double tempo_trascorso_totale = difftime(tempo_epoche[i], tempo_epoche[0]); + int minuti_epoca = (int)tempo_trascorso_epoca / 60; + int secondi_epoca = (int)tempo_trascorso_epoca % 60; + int minuti_totali = (int)tempo_trascorso_totale / 60; + int secondi_totali = (int)tempo_trascorso_totale % 60; + printf("Epoca %d\n", i); + printf("Tempo dall'epoca precedente: %d:%d\n", minuti_epoca, secondi_epoca); + printf("Tempo dall'inizio: %d:%d\n", minuti_epoca, secondi_epoca); + } int corrette = 0; - for(int indice_set = 0; indice_set < 1000; indice_set++) { + for(int indice_set = 0; indice_set < set.size; indice_set++) { //printf("\timmagine: %d\n", indice_set); @@ -102,6 +130,8 @@ void main() { } printf("\tRisposte corrette: %d\n", corrette); } + + salvaReteNeurale("rete_cifar_pesi.bin", &rete_neurale); } //Questa funzione ritorna 1 se la categoria รจ quella che voglio individuare, altrimenti 0 diff --git a/percettroni.h b/percettroni.h index f95f6be..d616064 100644 --- a/percettroni.h +++ b/percettroni.h @@ -47,6 +47,9 @@ void correggi_layer_input(Layer*, double**, double**, byte*, int); int previsione(double); +void salvaReteNeurale(const char*, ReteNeurale*); +ReteNeurale *caricaReteNeurale(const char*); + //Questa funzione genera un valore reale random compreso nell'intervallo [-1, 1] double randomico() { // Genero numeri nell'intervallo [-1,1] @@ -193,30 +196,79 @@ void correggi_layer_input(Layer *layer, double **gradienti, double **sigmoidi, b } } - - - - - -/* void correggi_pesi_layer(Percettrone[], int, int, double**, double[], double[]); -void correggi_pesi_layer_uno(Percettrone[], int, int, double**, byte[], double[]); - -void correggi_pesi_layer(Percettrone percettroni_layer[], int size_percettroni, int size_inputs, double **gradienti, double inputs[], double gradienti_bias[]) { - for(int i = 0; i < size_percettroni; i++) { - // Non termina questo for - for(int j = 0; j < size_inputs; j++) { - percettroni_layer[i].pesi[j] -= LRE * gradienti[i][j] * inputs[j]; - } - percettroni_layer[i].bias -= LRE * gradienti_bias[i]; +void salvaReteNeurale(const char *filename, ReteNeurale *rete) { + FILE *file = fopen(filename, "wb"); + if (!file) { + perror("Errore nell'apertura del file"); + exit(EXIT_FAILURE); } + + // Scrivi il numero di layer + fwrite(&rete->size, sizeof(int), 1, file); + + // Scrivi ogni layer + for (int i = 0; i < rete->size; i++) { + Layer *layer = &rete->layers[i]; + fwrite(&layer->size, sizeof(int), 1, file); + + // Scrivi ogni percettrone nel layer + for (int j = 0; j < layer->size; j++) { + Percettrone *perc = &layer->percettroni[j]; + fwrite(&perc->size, sizeof(int), 1, file); + fwrite(perc->pesi, sizeof(double), perc->size, file); + fwrite(&perc->bias, sizeof(double), 1, file); + } + } + + fclose(file); } -void correggi_pesi_layer_uno(Percettrone percettroni_layer[], int size_percettroni, int size_inputs, double **gradienti, byte inputs[], double gradienti_bias[]) { - - for(int i = 0; i < size_percettroni; i++) { - for(int j = 0; j < size_inputs; j++) { - percettroni_layer[i].pesi[j] -= LRE * gradienti[i][j] * inputs[j]; - } - percettroni_layer[i].bias -= LRE * gradienti_bias[i]; +ReteNeurale *caricaReteNeurale(const char *filename) { + FILE *file = fopen(filename, "rb"); + + if (!file) { + perror("Errore nell'apertura del file"); + return NULL; } -} */ + + ReteNeurale *rete = malloc(sizeof(ReteNeurale)); + if (!rete) { + perror("Errore nell'allocazione della memoria"); + return NULL; + } + + // Leggi il numero di layer + fread(&rete->size, sizeof(int), 1, file); + rete->layers = malloc(rete->size * sizeof(Layer)); + if (!rete->layers) { + perror("Errore nell'allocazione della memoria"); + return NULL; + } + + // Leggi ogni layer + for (int i = 0; i < rete->size; i++) { + Layer *layer = &rete->layers[i]; + fread(&layer->size, sizeof(int), 1, file); + layer->percettroni = malloc(layer->size * sizeof(Percettrone)); + if (!layer->percettroni) { + perror("Errore nell'allocazione della memoria"); + return NULL; + } + + // Leggi ogni percettrone nel layer + for (int j = 0; j < layer->size; j++) { + Percettrone *perc = &layer->percettroni[j]; + fread(&perc->size, sizeof(int), 1, file); + perc->pesi = malloc(perc->size * sizeof(double)); + if (!perc->pesi) { + perror("Errore nell'allocazione della memoria"); + return NULL; + } + fread(perc->pesi, sizeof(double), perc->size, file); + fread(&perc->bias, sizeof(double), 1, file); + } + } + + fclose(file); + return rete; +} \ No newline at end of file