From 760940ef978a830a5635ab6ae4203ba77a42ef10 Mon Sep 17 00:00:00 2001 From: mirimatcode Date: Thu, 20 Feb 2025 15:23:21 +0100 Subject: [PATCH] aggiustamento codice e libreria --- .vscode/settings.json | 14 +++++++ cifar-10/cifar10_manager.h | 18 ++++----- classificatore_singolo | Bin 21352 -> 21304 bytes classificatore_singolo.c | 74 ++++++++++++++++--------------------- mnist/mnist_manager.h | 22 +++++------ percettroni.h | 32 +++++++++++++++- rete_pesi.bin | Bin 891876 -> 0 bytes xor_manager.h | 47 +++++++++++++++++++++++ 8 files changed, 142 insertions(+), 65 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 rete_pesi.bin create mode 100644 xor_manager.h diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5947999 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "files.associations": { + "array": "cpp", + "bitset": "cpp", + "string_view": "cpp", + "format": "cpp", + "initializer_list": "cpp", + "ranges": "cpp", + "span": "cpp", + "stacktrace": "cpp", + "regex": "cpp" + }, + "copilot.baseUrl": "http://10.8.0.6:11434" +} \ No newline at end of file diff --git a/cifar-10/cifar10_manager.h b/cifar-10/cifar10_manager.h index 0391eec..7e58c47 100644 --- a/cifar-10/cifar10_manager.h +++ b/cifar-10/cifar10_manager.h @@ -1,7 +1,7 @@ #include #include -#define N_PIXEL 3072 // 1024 pixel * 3 (R, G, B) +#define N_INPUTS 3072 // 1024 pixel * 3 (R, G, B) // Siccome il char è un byte che rappresenta il valore tra 0 e 255. Per evitare confusioni definisco il tipo "byte" come in Java typedef unsigned char byte; @@ -9,8 +9,8 @@ typedef unsigned char byte; // Singola istanza del dataset. typedef struct { - byte categoria; - byte immagine[N_PIXEL]; + byte classificazione; + byte dati[N_INPUTS]; } Istanza; // Questo tipo fornisce il vettore delle istanze e il size (dimensione) del vettore @@ -38,9 +38,9 @@ Dataset *get_dataset(char *path) int numero_righe = 0; // Fino a quando questo fread restituisce 1 significa che il file contiene ancora roba - while (fread(&istanze[numero_righe].categoria, sizeof(byte), 1, file) == 1) + while (fread(&istanze[numero_righe].classificazione, sizeof(byte), 1, file) == 1) { - if (fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL) + if (fread(istanze[numero_righe].dati, sizeof(byte), N_INPUTS, file) == N_INPUTS) { numero_righe++; istanze = (Istanza *)realloc(istanze, sizeof(Istanza) * (numero_righe + 1)); @@ -57,7 +57,7 @@ Dataset *get_dataset(char *path) return set; } -void salva_dataset(const char *filename, Dataset *set) +/* void salva_dataset(const char *filename, Dataset *set) { FILE *file = fopen(filename, "wb"); if (!file) @@ -68,9 +68,9 @@ void salva_dataset(const char *filename, Dataset *set) for (int indice_istanze = 0; indice_istanze < set->size; indice_istanze++) { - fwrite(&set->istanze[indice_istanze].categoria, sizeof(byte), 1, file); - fwrite(&set->istanze[indice_istanze].immagine, sizeof(byte), N_PIXEL, file); + fwrite(&set->istanze[indice_istanze].classificazione, sizeof(byte), 1, file); + fwrite(&set->istanze[indice_istanze].dati, sizeof(byte), N_INPUTS, file); } fclose(file); -} \ No newline at end of file +} */ \ No newline at end of file diff --git a/classificatore_singolo b/classificatore_singolo index 6c66ed33215cea39edf41846f98df2109055214d..fc5b2c1a088a85dffcce662135ced21b363fd382 100755 GIT binary patch delta 4833 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 W&f8+z=V^vVX-vsf@(L{|8UJ5Eu%tTx delta 5029 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 U5~(iag5S_ncVy%LWGhnt3t}Mz`Tzg` diff --git a/classificatore_singolo.c b/classificatore_singolo.c index 4c0361c..69ff035 100644 --- a/classificatore_singolo.c +++ b/classificatore_singolo.c @@ -1,28 +1,14 @@ #include #include "percettroni.h" -#include "mnist/mnist_manager.h" +//#include "mnist/mnist_manager.h" +//#include "cifar_10/cifar10_manager.h" +#include "xor_manager.h" +//Scelgo quale categoria voglio identificare. nel caso dello xor -1 +#define CATEGORIA -1 #define NUM_LAYERS 5 - -#define PERCETTRONI_LAYER_0 128 -#define INPUT_LAYER_0 N_PIXEL - -#define PERCETTRONI_LAYER_1 64 -#define INPUT_LAYER_1 PERCETTRONI_LAYER_0 - -#define PERCETTRONI_LAYER_2 32 -#define INPUT_LAYER_2 PERCETTRONI_LAYER_1 - -#define PERCETTRONI_LAYER_3 16 -#define INPUT_LAYER_3 PERCETTRONI_LAYER_2 - -#define PERCETTRONI_LAYER_4 1 -#define INPUT_LAYER_4 PERCETTRONI_LAYER_3 - -#define MAX_EPOCHE 10 - -//Scelgo quale categoria voglio identificare. La 7 sono i cavalli. La rete mi dirà per ogni immagine se è un cavallo o no -#define CATEGORIA 7 +#define PERCETTRONI_LAYER_0 256 +#define MAX_EPOCHE 10000 byte get_out_corretto(byte); void stampa_layer_indirizzo(Layer*); @@ -33,7 +19,7 @@ void main() { srand(time(NULL)); - Dataset *set_appoggio = get_dataset(file_immagini, file_label); + Dataset *set_appoggio = crea_dataset_xor();//get_dataset(file_immagini, file_label); if(set_appoggio == NULL) return; @@ -43,24 +29,14 @@ void main() { ReteNeurale rete_neurale; ReteNeurale *puntatore_rete = caricaReteNeurale(file_pesi); 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); + rete_neurale = init_rete_neurale(NUM_LAYERS, PERCETTRONI_LAYER_0, N_INPUTS); } else { rete_neurale = *puntatore_rete; free(puntatore_rete); printf("Caricate impostazioni rete neurale da file\n"); } - printf("Numero immagini: %d\n", set.size); + printf("Numero elementi nel dataset: %d\n", set.size); //ADDESTRAMENTO for(int i = 0; i < MAX_EPOCHE; i++) { @@ -74,27 +50,32 @@ void main() { double **sigmoidi = (double **)malloc(sizeof(double*) * NUM_LAYERS); sigmoidi[0] = (double*)malloc(sizeof(double) * PERCETTRONI_LAYER_0); - sigmoidi[0] = funzioni_attivazione_layer_byte(rete_neurale.layers[0], set.istanze[indice_set].immagine); + sigmoidi[0] = funzioni_attivazione_layer_byte(rete_neurale.layers[0], set.istanze[indice_set].dati); for(int j = 1; j < NUM_LAYERS; j++) { sigmoidi[j] = (double*)malloc(sizeof(double) * rete_neurale.layers[j].size); sigmoidi[j] = funzioni_attivazione_layer_double(rete_neurale.layers[j], sigmoidi[j-1]); } - byte output_corretto = get_out_corretto(set.istanze[indice_set].categoria); + byte output_corretto = get_out_corretto(set.istanze[indice_set].classificazione); + + printf("Inputs: %d %d\t", set.istanze[indice_set].dati[0], set.istanze[indice_set].dati[1]); + printf("Previsione: %d, out corretto: %d\n", previsione(sigmoidi[NUM_LAYERS-1][0]), output_corretto); //Se prevede male if(previsione(sigmoidi[NUM_LAYERS-1][0]) != output_corretto) { + double **gradienti = (double**)malloc(sizeof(double*) * NUM_LAYERS); for(int indice_layer = 0; indice_layer < NUM_LAYERS; indice_layer++) { gradienti[indice_layer] = (double*)malloc(sizeof(double) * rete_neurale.layers[indice_layer].size); } - gradienti[NUM_LAYERS-1][0] = (output_corretto - sigmoidi[NUM_LAYERS-1][0]); + //Errore + gradienti[NUM_LAYERS-1][0] = (output_corretto - sigmoidi[NUM_LAYERS-1][0]); correggi_layer_interni(&rete_neurale, gradienti, sigmoidi); - correggi_layer_input(&rete_neurale.layers[0], gradienti, sigmoidi, set.istanze[indice_set].immagine, NUM_LAYERS); + correggi_layer_input(&rete_neurale.layers[0], gradienti, sigmoidi, set.istanze[indice_set].dati, NUM_LAYERS); } else { @@ -103,17 +84,24 @@ void main() { } printf("\tRisposte corrette: %d\n", corrette); + + if(corrette == set.size) { + break; + } } - salvaReteNeurale(file_pesi, &rete_neurale); + //salvaReteNeurale(file_pesi, &rete_neurale); } //Questa funzione ritorna 1 se la categoria è quella che voglio individuare, altrimenti 0 byte get_out_corretto(byte categoria) { - if(categoria == CATEGORIA) - return 1; - else - return 0; + if(CATEGORIA != -1) { + if(categoria == CATEGORIA) + return 1; + else + return 0; + } + else return categoria; } void stampa_layer_indirizzo(Layer *layer) { diff --git a/mnist/mnist_manager.h b/mnist/mnist_manager.h index b967796..d2c0a7a 100644 --- a/mnist/mnist_manager.h +++ b/mnist/mnist_manager.h @@ -19,7 +19,7 @@ Byte 8 in poi: 60.000 byte, ognuno dei quali rappresenta l'etichetta di un'immag #include #include -#define N_PIXEL 784 // Immagine 28x28 +#define N_INPUTS 784 // Immagine 28x28 // Siccome il char è un byte che rappresenta il valore tra 0 e 255. Per evitare confusioni definisco il tipo "byte" come in Java typedef unsigned char byte; @@ -27,8 +27,8 @@ typedef unsigned char byte; // Singola istanza del dataset. typedef struct { - byte categoria; - byte immagine[N_PIXEL]; + byte classificazione; + byte dati[N_INPUTS]; } Istanza; // Questo tipo fornisce il vettore delle istanze e il size (dimensione) del vettore @@ -64,10 +64,10 @@ Dataset *get_dataset(char *path_mnist, char *path_categoria) int numero_righe = 0; //Leggo male il file, cambiare in base alle dichiarazioni sopra - if(fread(istanze[numero_righe].immagine, sizeof(byte), 16, file) == 16 && fread(&istanze[numero_righe].categoria, sizeof(byte), 8, categorie) == 8) - while (fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL) + if(fread(istanze[numero_righe].dati, sizeof(byte), 16, file) == 16 && fread(&istanze[numero_righe].classificazione, sizeof(byte), 8, categorie) == 8) + while (fread(istanze[numero_righe].dati, sizeof(byte), N_INPUTS, file) == N_INPUTS) { - if(fread(&istanze[numero_righe].categoria, sizeof(byte), 1, categorie) == 1) { + if(fread(&istanze[numero_righe].classificazione, sizeof(byte), 1, categorie) == 1) { numero_righe++; istanze = (Istanza *)realloc(istanze, sizeof(Istanza) * (numero_righe + 1)); } @@ -81,7 +81,7 @@ Dataset *get_dataset(char *path_mnist, char *path_categoria) return set; } -void salva_dataset(const char *filename, Dataset *set) +/* void salva_dataset(const char *filename, Dataset *set) { FILE *file = fopen(filename, "wb"); if (!file) @@ -92,12 +92,12 @@ void salva_dataset(const char *filename, Dataset *set) for (int indice_istanze = 0; indice_istanze < set->size; indice_istanze++) { - fwrite(&set->istanze[indice_istanze].categoria, sizeof(byte), 1, file); - fwrite(&set->istanze[indice_istanze].immagine, sizeof(byte), N_PIXEL, file); + fwrite(&set->istanze[indice_istanze].classificazione, sizeof(byte), 1, file); + fwrite(&set->istanze[indice_istanze].dati, sizeof(byte), N_INPUTS, file); } fclose(file); -} +} */ /* void main() { Dataset *set = get_dataset("t10k-images.idx3-ubyte", "t10k-labels.idx1-ubyte"); @@ -108,6 +108,6 @@ void salva_dataset(const char *filename, Dataset *set) } for(int i = 0; i < set->size; i++) { - printf("immagine %d - valore rappresentato: %d\n", i, set->istanze[i].categoria); + printf("immagine %d - valore rappresentato: %d\n", i, set->istanze[i].classificazione); } } */ \ No newline at end of file diff --git a/percettroni.h b/percettroni.h index d7c3a14..9943596 100644 --- a/percettroni.h +++ b/percettroni.h @@ -32,7 +32,8 @@ typedef struct { double randomico(); Percettrone inzializza_percettrone(int); -ReteNeurale inizializza_rete_neurale(int); +//ReteNeurale inizializza_rete_neurale(int); +ReteNeurale init_rete_neurale(int, int, int); Layer inizializza_layer(int, int); double sigmoide_byte(Percettrone, byte*, int); @@ -69,14 +70,41 @@ Percettrone inizializza_percettrone(int n_pesi) { } //Questa funzione inizializza una rete neurale. Diamo il numero di layer desiderato e restituisce un ReteNeurale -ReteNeurale inizializza_rete_neurale(int n_layers) { +/* ReteNeurale inizializza_rete_neurale(int n_layers) { ReteNeurale r; r.layers = (Layer*)malloc(sizeof(Layer) * n_layers); r.size = n_layers; + return r; +} */ + +ReteNeurale init_rete_neurale(int numero_layers, int numero_percettroni_iniziali, int numero_input) { + ReteNeurale r; + r.layers = (Layer*)malloc(sizeof(Layer) * numero_layers); + r.size = numero_layers; + + //Funzione esponenziale inversa layer 5 + for (int livello = 0; livello < numero_layers; livello++) { + double esponente = (double)livello / (double)numero_layers; + double frazione = (double)1 / (double)numero_percettroni_iniziali; + + int numero_percettroni_livello = (int)((double)numero_percettroni_iniziali * pow(frazione, esponente)); + if(livello == numero_layers -1) + numero_percettroni_livello = 1; + + //printf("esponente %f -> frazione: %f\n", esponente, frazione); + printf("Layer %d -> percettroni: %d\n", livello, numero_percettroni_livello); + + if(livello == 0) + r.layers[livello] = inizializza_layer(numero_percettroni_livello, numero_input); + else + r.layers[livello] = inizializza_layer(numero_percettroni_livello, r.layers[livello-1].size); + } + return r; } + //Questa funzione serve ad inizializzare il singolo layer con il numero di percettroni che vogliamo //Ogni percettrone a sua volta viene automaticamente inizializzato con il numero di pesi che vogliamo e coi valori di partenza Layer inizializza_layer(int n_percettroni, int n_pesi) { diff --git a/rete_pesi.bin b/rete_pesi.bin deleted file mode 100644 index 16f244c464a6b756682befc70f2ab937294f9e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891876 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 diff --git a/xor_manager.h b/xor_manager.h new file mode 100644 index 0000000..f525694 --- /dev/null +++ b/xor_manager.h @@ -0,0 +1,47 @@ +#include +#include + +#define N_INPUTS 2 + +// Siccome il char è un byte che rappresenta il valore tra 0 e 255. Per evitare confusioni definisco il tipo "byte" come in Java +typedef unsigned char byte; + +// Singola istanza del dataset. +typedef struct +{ + byte classificazione; + byte dati[N_INPUTS]; +} Istanza; + +// Questo tipo fornisce il vettore delle istanze e il size (dimensione) del vettore +typedef struct +{ + int size; + Istanza *istanze; +} Dataset; + +Dataset *crea_dataset_xor(); + +Dataset *crea_dataset_xor() { + Dataset *set = (Dataset *)malloc(sizeof(Dataset)); + set->istanze = (Istanza *)malloc(sizeof(Istanza) * 4); + set->size = 4; + + set->istanze[0].dati[0] = 0; + set->istanze[0].dati[1] = 0; + set->istanze[0].classificazione = 1; + + set->istanze[1].dati[0] = 0; + set->istanze[1].dati[1] = 1; + set->istanze[1].classificazione = 0; + + set->istanze[2].dati[0] = 1; + set->istanze[2].dati[1] = 0; + set->istanze[2].classificazione = 0; + + set->istanze[3].dati[0] = 1; + set->istanze[3].dati[1] = 1; + set->istanze[3].classificazione = 1; + + return set; +} \ No newline at end of file