diff --git a/cavalli.bin b/cavalli.bin deleted file mode 100644 index 0cec6e2..0000000 Binary files a/cavalli.bin and /dev/null differ diff --git a/classificatore_singolo b/classificatore_singolo index f4687ee..820ba44 100755 Binary files a/classificatore_singolo and b/classificatore_singolo differ diff --git a/classificatore_singolo.c b/classificatore_singolo.c index 45b2c5e..6308a5b 100644 --- a/classificatore_singolo.c +++ b/classificatore_singolo.c @@ -2,20 +2,24 @@ #include "percettroni.h" #include "mnist/mnist_manager.h" -#define NUM_LAYERS 4 +#define NUM_LAYERS 5 -#define PERCETTRONI_LAYER_0 32 +#define PERCETTRONI_LAYER_0 128 #define INPUT_LAYER_0 N_PIXEL -#define PERCETTRONI_LAYER_1 16 -#define INPUT_LAYER_1 32 -#define PERCETTRONI_LAYER_2 8 -#define INPUT_LAYER_2 16 -#define PERCETTRONI_LAYER_3 1 -#define INPUT_LAYER_3 8 -//#define PERCETTRONI_LAYER_4 1 -//#define INPUT_LAYER_4 10 -#define MAX_EPOCHE 50 +#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 1000 //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 @@ -103,7 +107,7 @@ void main() { 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]); + 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); diff --git a/percettroni.h b/percettroni.h index 145b13c..0c5caf1 100644 --- a/percettroni.h +++ b/percettroni.h @@ -6,7 +6,7 @@ typedef unsigned char byte; -double LRE = 0.2; +double LRE = 0.1; double soglia_sigmoide = 0.5; typedef struct { @@ -162,9 +162,9 @@ void correggi_layer_interni(ReteNeurale *rete, double **gradienti, double **sigm for(int indice_percettrone = 0; indice_percettrone < rete->layers[indice_layer].size; indice_percettrone++) {//Numero percettroni for(int indice_peso = 0; indice_peso < rete->layers[indice_layer].percettroni[indice_percettrone].size; indice_peso++) {//Numero pesi - //gradienti[indice_layer][indice_percettrone] = gradienti[rete->size-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); - //rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); - rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[rete->size-1][0] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); + gradienti[indice_layer][indice_percettrone] = gradienti[rete->size-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); + rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); + //rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[rete->size-1][0] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); } rete->layers[indice_layer].percettroni[indice_percettrone].bias += (gradienti[indice_layer][indice_percettrone] * LRE); //printf("bias: %f\n", rete->layers[indice_layer].percettroni[indice_percettrone].bias); @@ -179,9 +179,9 @@ void correggi_layer_input(Layer *layer, double **gradienti, double **sigmoidi, b for(int indice_percettrone = 0; indice_percettrone < layer->size; indice_percettrone++) {//Numero percettroni for(int indice_peso = 0; indice_peso < layer->percettroni->size; indice_peso++) { //Numero pesi - //gradienti[indice_layer][indice_percettrone] = gradienti[n_layers-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); - //layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * inputs[indice_peso]); - layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[n_layers-1][0] * LRE * inputs[indice_peso]); + gradienti[indice_layer][indice_percettrone] = gradienti[n_layers-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); + layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * inputs[indice_peso]); + //layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[n_layers-1][0] * LRE * inputs[indice_peso]); } layer->percettroni[indice_percettrone].bias += (gradienti[n_layers-1][0] * LRE); } diff --git a/rete_cifar10 b/rete_cifar10 deleted file mode 100755 index e7a60b7..0000000 Binary files a/rete_cifar10 and /dev/null differ diff --git a/rete_cifar_pesi.bin b/rete_cifar_pesi.bin deleted file mode 100644 index f9efa5d..0000000 Binary files a/rete_cifar_pesi.bin and /dev/null differ diff --git a/rete_cifar_pesi_strammata.bin b/rete_cifar_pesi_strammata.bin deleted file mode 100644 index ae78ae9..0000000 Binary files a/rete_cifar_pesi_strammata.bin and /dev/null differ diff --git a/visualizzatore b/visualizzatore index 096807d..5e493b0 100755 Binary files a/visualizzatore and b/visualizzatore differ diff --git a/visualizzatore.c b/visualizzatore.c index e08e2fe..e9e1ce2 100644 --- a/visualizzatore.c +++ b/visualizzatore.c @@ -1,9 +1,14 @@ #include #include #include "percettroni.h" +#include "mnist/mnist_manager.h" -#define IMAGE_WIDTH 32 -#define IMAGE_HEIGHT 32 +//CIFAR_10 +/* #define IMAGE_WIDTH 32 +#define IMAGE_HEIGHT 32 */ +//MNIST +#define IMAGE_WIDTH 28 +#define IMAGE_HEIGHT 28 #define SCALE_FACTOR 2 //Cavalli @@ -27,7 +32,8 @@ void main() { init_allegro(); - set = get_dataset("cifar-10-batches/test_batch.bin"); + //get_dataset("cifar-10-batches/test_batch.bin"); + set = get_dataset("mnist/t10k-images.idx3-ubyte", "mnist/t10k-labels.idx1-ubyte"); if (set == NULL) { printf("Errore nel caricare il dataset\n"); return; @@ -67,7 +73,8 @@ void init_allegro() { show_mouse(screen); } -void carica_immagine(int indice_set) +//cifar_10 +/* void carica_immagine(int indice_set) { printf("Immagine indice: %d, categoria: %d, previsione: %d\n", indice_set, set->istanze[indice_set].categoria, prevedi(indice_set)); @@ -81,6 +88,29 @@ void carica_immagine(int indice_set) putpixel(image, x, y, makecol(r, g, b)); } } +} */ + +//MNIST +void carica_immagine(int indice_set) +{ + // Stampa informazioni sull'immagine + printf("Immagine indice: %d, categoria: %d\n", indice_set, set->istanze[indice_set].categoria); + + // Itera su ogni pixel dell'immagine + for (int y = 0; y < IMAGE_HEIGHT; y++) + { + for (int x = 0; x < IMAGE_WIDTH; x++) + { + // Ottieni il valore del pixel (scala di grigi, quindi un solo canale) + int gray_value = set->istanze[indice_set].immagine[y * IMAGE_WIDTH + x]; + + // Converti il valore in scala di grigi in un colore RGB (r = g = b = gray_value) + int color = makecol(gray_value, gray_value, gray_value); + + // Disegna il pixel sull'immagine + putpixel(image, x, y, color); + } + } } void disegna_interfaccia()