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"
|
#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.
@@ -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
@@ -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;
|
||||||
|
|||||||
Binary file not shown.
+11
-10
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user