diff --git a/classificatore b/classificatore new file mode 100755 index 0000000..8c8e84d Binary files /dev/null and b/classificatore differ diff --git a/classificatore.c b/classificatore.c index acbc531..993ae15 100644 --- a/classificatore.c +++ b/classificatore.c @@ -1,6 +1,6 @@ #include "percettroni.h" -#define EPOCHE 50 +#define EPOCHE 100 void main() { //input, layers, perc iniz, perc fin @@ -8,11 +8,13 @@ void main() { //stampa_pesi_rete(rete); //Dataset xor = *crea_dataset_xor(); - Dataset mnist = *get_dataset(); + Dataset mnist = *get_dataset(file_immagini, file_label); for(int epoca = 0; epoca < EPOCHE; epoca++) { //printf("\nEPOCA %d\n", epoca); if (addestra(&rete, mnist)) break; } -} \ No newline at end of file + + salvaReteNeurale(file_pesi, &rete); +} diff --git a/classificatore_mnist_50_epoche b/classificatore_mnist_50_epoche deleted file mode 100755 index 4b9897f..0000000 Binary files a/classificatore_mnist_50_epoche and /dev/null differ diff --git a/mnist/mnist_manager.h b/mnist/mnist_manager.h index 737e6e4..1db36fe 100644 --- a/mnist/mnist_manager.h +++ b/mnist/mnist_manager.h @@ -21,8 +21,8 @@ Byte 8 in poi: 60.000 byte, ognuno dei quali rappresenta l'etichetta di un'immag char *file_immagini = "mnist/t10k-images.idx3-ubyte"; char *file_label = "mnist/t10k-labels.idx1-ubyte"; -// char *file_immagini = "mnist/train-images.idx3-ubyte"; -// char *file_label = "mnist/train-labels.idx1-ubyte"; +char *file_test = "mnist/train-images.idx3-ubyte"; +char *file_test_label = "mnist/train-labels.idx1-ubyte"; #define N_INPUTS 784 // Immagine 28x28 @@ -43,24 +43,24 @@ typedef struct Istanza *istanze; } Dataset; -Dataset *get_dataset(); +Dataset *get_dataset(char *, char *); // Questo metodo legge il file in questione e restituisce un puntatore a Dataset se il file esiste, altrimenti NULL // Ritorna un puntatore perchè in questo caso posso gestire il ritorno NULL. -Dataset *get_dataset() +Dataset *get_dataset(char *immagine, char *label) { Dataset *set = (Dataset *)malloc(sizeof(Dataset)); FILE *file; FILE *categorie; Istanza *istanze = (Istanza *)malloc(sizeof(Istanza)); - file = fopen(file_immagini, "rb"); + file = fopen(immagine, "rb"); if (file == NULL) { printf("Errore nella funzione fopen() nelle immagini\n"); return NULL; } - categorie = fopen(file_label, "rb"); + categorie = fopen(label, "rb"); if (file == NULL) { printf("Errore nella funzione fopen() nelle categorie\n"); return NULL; diff --git a/percettroni.h b/percettroni.h index 5d608d3..7b37cb5 100644 --- a/percettroni.h +++ b/percettroni.h @@ -3,7 +3,7 @@ #include #include -char *file_pesi = "rete_pesi.bin"; +char *file_pesi = "rete_mnist.bin"; #include "mnist/mnist_manager.h" @@ -21,6 +21,7 @@ typedef unsigned char byte; double LRE = 0.1; double soglia_sigmoide = 0.5; +#define TOLLERANZA 95 typedef struct { @@ -430,6 +431,8 @@ double **elabora_sigmoidi(ReteNeurale *rete, Istanza istanza) sigmoidi[0][indice_percettrone] = sigmoide(rete->layers[0].percettroni[indice_percettrone], inputs); } + free(inputs); + for (int indice_layer = 1; indice_layer < rete->size; indice_layer++) { sigmoidi[indice_layer] = (double *)malloc(sizeof(double) * rete->layers[indice_layer].size); @@ -511,12 +514,13 @@ char addestra(ReteNeurale *rete_neurale, Dataset set) byte output_corretto = set.istanze[indice_set].classificazione; double **sigmoidi = elabora_sigmoidi(rete_neurale, set.istanze[indice_set]); - double *sigmoidi_softmax = elabora_sigmoidi(rete_neurale, set.istanze[indice_set])[rete_neurale->size -1]; - double **gradienti = elabora_gradienti(rete_neurale, output_corretto, sigmoidi); - int previsto = previsione_softmax(sigmoidi_softmax, rete_neurale->layers[rete_neurale->size -1].size); + double *sigmoidi_softmax = (double *)malloc(sizeof(double) * rete_neurale->layers[rete_neurale->size - 1].size); + memcpy(sigmoidi_softmax, sigmoidi[rete_neurale->size - 1], rete_neurale->layers[rete_neurale->size - 1].size * sizeof(double)); + + double **gradienti = elabora_gradienti(rete_neurale, output_corretto, sigmoidi); - //printf("Previsione: %d - out: %d\n", previsto, output_corretto); + int previsto = previsione_softmax(sigmoidi_softmax, rete_neurale->layers[rete_neurale->size - 1].size); if (previsto == output_corretto) { corrette++; @@ -531,11 +535,14 @@ char addestra(ReteNeurale *rete_neurale, Dataset set) for(int i = 0; i < rete_neurale->size; i++) free(sigmoidi[i]); free(sigmoidi); + free(sigmoidi_softmax); } - printf("Risposte corrette: %d%\n", (corrette * 100) / set.size); + int percentuale = (int)((corrette * 100) / set.size); - if(corrette == set.size) + printf("Risposte corrette: %d%%\n", percentuale); + + if(percentuale >= TOLLERANZA) return 1; else return 0; diff --git a/rete_mnist.bin b/rete_mnist.bin new file mode 100644 index 0000000..f72f56a Binary files /dev/null and b/rete_mnist.bin differ diff --git a/visualizzatore.c b/visualizzatore.c index 61e968b..7b37e3c 100644 --- a/visualizzatore.c +++ b/visualizzatore.c @@ -4,16 +4,16 @@ //#include "mnist/mnist_manager.h" //CIFAR_10 -#define IMAGE_WIDTH 32 -#define IMAGE_HEIGHT 32 +/* #define IMAGE_WIDTH 32 +#define IMAGE_HEIGHT 32 */ //MNIST -/* #define IMAGE_WIDTH 28 -#define IMAGE_HEIGHT 28*/ +#define IMAGE_WIDTH 28 +#define IMAGE_HEIGHT 28 #define SCALE_FACTOR 2 //Cavalli -#define CATEGORIA 7 +//#define CATEGORIA 7 BITMAP *buffer; BITMAP *image; @@ -34,7 +34,8 @@ void main() init_allegro(); //get_dataset("cifar-10-batches/test_batch.bin"); - set = get_dataset(file_immagini);//get_dataset(file_immagini, file_label); + + set = get_dataset(file_test, file_test_label); if (set == NULL) { printf("Errore nel caricare il dataset\n"); return; @@ -75,7 +76,7 @@ void init_allegro() { } //cifar_10 -void carica_immagine(int indice_set) +/* void carica_immagine(int indice_set) { printf("Immagine indice: %d, categoria: %d, previsione: %d\n", indice_set, set->istanze[indice_set].classificazione, prevedi(indice_set)); @@ -89,10 +90,10 @@ void carica_immagine(int indice_set) putpixel(image, x, y, makecol(r, g, b)); } } -} +} */ //MNIST -/* void carica_immagine(int indice_set) +void carica_immagine(int indice_set) { // Stampa informazioni sull'immagine printf("Immagine indice: %d, valore: %d. è un 7? %d\n", indice_set, set->istanze[indice_set].classificazione, prevedi(indice_set)); @@ -112,7 +113,7 @@ void carica_immagine(int indice_set) putpixel(image, x, y, color); } } -} */ +} void disegna_interfaccia() {