versione alfa. Addestramento da 100 epoche effettuato
This commit is contained in:
Executable
BIN
Binary file not shown.
+4
-2
@@ -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.
@@ -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
@@ -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;
|
||||
|
||||
Binary file not shown.
+11
-10
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user