versione alfa. Addestramento da 100 epoche effettuato

This commit is contained in:
2026-03-25 17:47:48 +01:00
parent 0b31a0e0d7
commit 59fae5238b
7 changed files with 36 additions and 26 deletions
Executable
BIN
View File
Binary file not shown.
+4 -2
View File
@@ -1,6 +1,6 @@
#include "percettroni.h" #include "percettroni.h"
#define EPOCHE 50 #define EPOCHE 100
void main() { void main() {
//input, layers, perc iniz, perc fin //input, layers, perc iniz, perc fin
@@ -8,11 +8,13 @@ void main() {
//stampa_pesi_rete(rete); //stampa_pesi_rete(rete);
//Dataset xor = *crea_dataset_xor(); //Dataset xor = *crea_dataset_xor();
Dataset mnist = *get_dataset(); Dataset mnist = *get_dataset(file_immagini, file_label);
for(int epoca = 0; epoca < EPOCHE; epoca++) { for(int epoca = 0; epoca < EPOCHE; epoca++) {
//printf("\nEPOCA %d\n", epoca); //printf("\nEPOCA %d\n", epoca);
if (addestra(&rete, mnist)) if (addestra(&rete, mnist))
break; break;
} }
salvaReteNeurale(file_pesi, &rete);
} }
Binary file not shown.
+6 -6
View File
@@ -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_immagini = "mnist/t10k-images.idx3-ubyte";
char *file_label = "mnist/t10k-labels.idx1-ubyte"; char *file_label = "mnist/t10k-labels.idx1-ubyte";
// char *file_immagini = "mnist/train-images.idx3-ubyte"; char *file_test = "mnist/train-images.idx3-ubyte";
// char *file_label = "mnist/train-labels.idx1-ubyte"; char *file_test_label = "mnist/train-labels.idx1-ubyte";
#define N_INPUTS 784 // Immagine 28x28 #define N_INPUTS 784 // Immagine 28x28
@@ -43,24 +43,24 @@ typedef struct
Istanza *istanze; Istanza *istanze;
} Dataset; } 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 // 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. // 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)); Dataset *set = (Dataset *)malloc(sizeof(Dataset));
FILE *file; FILE *file;
FILE *categorie; FILE *categorie;
Istanza *istanze = (Istanza *)malloc(sizeof(Istanza)); Istanza *istanze = (Istanza *)malloc(sizeof(Istanza));
file = fopen(file_immagini, "rb"); file = fopen(immagine, "rb");
if (file == NULL) { if (file == NULL) {
printf("Errore nella funzione fopen() nelle immagini\n"); printf("Errore nella funzione fopen() nelle immagini\n");
return NULL; return NULL;
} }
categorie = fopen(file_label, "rb"); categorie = fopen(label, "rb");
if (file == NULL) { if (file == NULL) {
printf("Errore nella funzione fopen() nelle categorie\n"); printf("Errore nella funzione fopen() nelle categorie\n");
return NULL; return NULL;
+14 -7
View File
@@ -3,7 +3,7 @@
#include <math.h> #include <math.h>
#include <time.h> #include <time.h>
char *file_pesi = "rete_pesi.bin"; char *file_pesi = "rete_mnist.bin";
#include "mnist/mnist_manager.h" #include "mnist/mnist_manager.h"
@@ -21,6 +21,7 @@ typedef unsigned char byte;
double LRE = 0.1; double LRE = 0.1;
double soglia_sigmoide = 0.5; double soglia_sigmoide = 0.5;
#define TOLLERANZA 95
typedef struct 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); 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++) for (int indice_layer = 1; indice_layer < rete->size; indice_layer++)
{ {
sigmoidi[indice_layer] = (double *)malloc(sizeof(double) * rete->layers[indice_layer].size); 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; byte output_corretto = set.istanze[indice_set].classificazione;
double **sigmoidi = elabora_sigmoidi(rete_neurale, set.istanze[indice_set]); 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 *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); double **gradienti = elabora_gradienti(rete_neurale, output_corretto, sigmoidi);
int previsto = previsione_softmax(sigmoidi_softmax, rete_neurale->layers[rete_neurale->size -1].size); int previsto = previsione_softmax(sigmoidi_softmax, rete_neurale->layers[rete_neurale->size - 1].size);
//printf("Previsione: %d - out: %d\n", previsto, output_corretto);
if (previsto == output_corretto) { if (previsto == output_corretto) {
corrette++; corrette++;
@@ -531,11 +535,14 @@ char addestra(ReteNeurale *rete_neurale, Dataset set)
for(int i = 0; i < rete_neurale->size; i++) for(int i = 0; i < rete_neurale->size; i++)
free(sigmoidi[i]); free(sigmoidi[i]);
free(sigmoidi); 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; return 1;
else else
return 0; return 0;
BIN
View File
Binary file not shown.
+11 -10
View File
@@ -4,16 +4,16 @@
//#include "mnist/mnist_manager.h" //#include "mnist/mnist_manager.h"
//CIFAR_10 //CIFAR_10
#define IMAGE_WIDTH 32 /* #define IMAGE_WIDTH 32
#define IMAGE_HEIGHT 32 #define IMAGE_HEIGHT 32 */
//MNIST //MNIST
/* #define IMAGE_WIDTH 28 #define IMAGE_WIDTH 28
#define IMAGE_HEIGHT 28*/ #define IMAGE_HEIGHT 28
#define SCALE_FACTOR 2 #define SCALE_FACTOR 2
//Cavalli //Cavalli
#define CATEGORIA 7 //#define CATEGORIA 7
BITMAP *buffer; BITMAP *buffer;
BITMAP *image; BITMAP *image;
@@ -34,7 +34,8 @@ void main()
init_allegro(); init_allegro();
//get_dataset("cifar-10-batches/test_batch.bin"); //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) { if (set == NULL) {
printf("Errore nel caricare il dataset\n"); printf("Errore nel caricare il dataset\n");
return; return;
@@ -75,7 +76,7 @@ void init_allegro() {
} }
//cifar_10 //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)); 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)); putpixel(image, x, y, makecol(r, g, b));
} }
} }
} } */
//MNIST //MNIST
/* void carica_immagine(int indice_set) void carica_immagine(int indice_set)
{ {
// Stampa informazioni sull'immagine // Stampa informazioni sull'immagine
printf("Immagine indice: %d, valore: %d. è un 7? %d\n", indice_set, set->istanze[indice_set].classificazione, prevedi(indice_set)); 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); putpixel(image, x, y, color);
} }
} }
} */ }
void disegna_interfaccia() void disegna_interfaccia()
{ {