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"
#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;
}
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_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;
+13 -6
View File
@@ -3,7 +3,7 @@
#include <math.h>
#include <time.h>
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,13 +514,14 @@ 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 *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);
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) {
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;
BIN
View File
Binary file not shown.
+11 -10
View File
@@ -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()
{