provo a ottimizzarlo con relu per farlo convergere prima. Addestrato al 99%

This commit is contained in:
2026-03-26 13:13:25 +01:00
parent 50ec609ff9
commit 80a542b9cc
5 changed files with 22 additions and 15 deletions
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -4,8 +4,8 @@
void main() { void main() {
//input, layers, perc iniz, perc fin //input, layers, perc iniz, perc fin
//ReteNeurale rete = inizializza_rete_neurale(N_INPUTS, 10, 256, 10); ReteNeurale rete = inizializza_rete_neurale(N_INPUTS, 2, 32, 10);
ReteNeurale rete = *caricaReteNeurale(file_pesi); //ReteNeurale rete = *caricaReteNeurale(file_pesi);
//stampa_pesi_rete(rete); //stampa_pesi_rete(rete);
//Dataset xor = *crea_dataset_xor(); //Dataset xor = *crea_dataset_xor();
+20 -13
View File
@@ -19,9 +19,9 @@ char *file_pesi = "rete_mnist.bin";
typedef unsigned char byte; typedef unsigned char byte;
double LRE = 0.1; double LRE = 0.01;
double soglia_sigmoide = 0.5; double soglia_sigmoide = 0.5;
#define TOLLERANZA 97 #define TOLLERANZA 99
typedef struct typedef struct
{ {
@@ -312,20 +312,22 @@ double **elabora_gradienti(ReteNeurale *rete_neurale, byte output_corretto, doub
gradienti[indice_layer] = (double *)malloc(sizeof(double) * rete_neurale->layers[indice_layer].size); gradienti[indice_layer] = (double *)malloc(sizeof(double) * rete_neurale->layers[indice_layer].size);
} }
//ULTIMO LAYER
for (int indice_percettrone = 0; indice_percettrone < rete_neurale->layers[rete_neurale->size - 1].size; indice_percettrone++) for (int indice_percettrone = 0; indice_percettrone < rete_neurale->layers[rete_neurale->size - 1].size; indice_percettrone++)
{ {
double gradiente_errore = 0.0; //double gradiente_errore = 0.0;
if (indice_percettrone == output_corretto) if (indice_percettrone == output_corretto)
{ {
gradiente_errore = 1 - sigmoidi[rete_neurale->size - 1][indice_percettrone]; gradienti[rete_neurale->size - 1][indice_percettrone] = 1 - sigmoidi[rete_neurale->size - 1][indice_percettrone];
} }
else else
{ {
gradiente_errore = 0 - sigmoidi[rete_neurale->size - 1][indice_percettrone]; gradienti[rete_neurale->size - 1][indice_percettrone] = 0 - sigmoidi[rete_neurale->size - 1][indice_percettrone];
} }
gradienti[rete_neurale->size - 1][indice_percettrone] = gradiente_errore * derivata_sigmoide(sigmoidi[rete_neurale->size - 1][indice_percettrone]); //gradienti[rete_neurale->size - 1][indice_percettrone] = gradiente_errore * derivata_sigmoide(sigmoidi[rete_neurale->size - 1][indice_percettrone]);
} }
//--------------
discesa_gradiente(rete_neurale, sigmoidi, gradienti); discesa_gradiente(rete_neurale, sigmoidi, gradienti);
@@ -346,16 +348,20 @@ double sigmoide(Percettrone p, double *valori)
// Sigmoide // Sigmoide
double risultato = 1.0 / (1.0 + exp(-sommatoria)); double risultato = 1.0 / (1.0 + exp(-sommatoria));
// ReLU // ReLU
// double risultato = sommatoria > 0 ? sommatoria : 0.0f; //double risultato = sommatoria > 0 ? sommatoria : 0.0f;
// printf(" sommatoria %f -> %f\n",sommatoria, risultato); //printf(" sommatoria %f -> %f\n",sommatoria, risultato);
return risultato; return risultato;
} }
double derivata_sigmoide(double valore) double derivata_sigmoide(double valore)
{ {
//Sigmoide
double derivata = valore * (1.0 - valore); double derivata = valore * (1.0 - valore);
//ReLU
//double derivata = valore >= 0 ? 1.0f : 0.0f;
return derivata; return derivata;
} }
@@ -378,13 +384,13 @@ void softmax(double *input, int size)
input[i] /= sum; input[i] /= sum;
} }
int previsione(double valore) /* int previsione(double valore)
{ {
if (valore >= soglia_sigmoide) if (valore >= soglia_sigmoide)
return 1; return 1;
else else
return 0; return 0;
} } */
int previsione_softmax(double *livello_percettroni, int size) int previsione_softmax(double *livello_percettroni, int size)
{ {
@@ -529,7 +535,6 @@ char addestra(ReteNeurale *rete_neurale, Dataset set)
memcpy(sigmoidi_softmax, sigmoidi[rete_neurale->size - 1], rete_neurale->layers[rete_neurale->size - 1].size * sizeof(double)); 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);
if (previsto == output_corretto) if (previsto == output_corretto)
@@ -537,6 +542,8 @@ char addestra(ReteNeurale *rete_neurale, Dataset set)
corrette++; corrette++;
} }
//printf("Previsto: %d, output: %d\n", previsto, output_corretto);
aggiorna_pesi(rete_neurale, sigmoidi, gradienti, set.istanze[indice_set]); aggiorna_pesi(rete_neurale, sigmoidi, gradienti, set.istanze[indice_set]);
for (int i = 0; i < rete_neurale->size; i++) for (int i = 0; i < rete_neurale->size; i++)
@@ -549,9 +556,9 @@ char addestra(ReteNeurale *rete_neurale, Dataset set)
free(sigmoidi_softmax); free(sigmoidi_softmax);
} }
int percentuale = (int)((corrette * 100) / set.size); float percentuale = ((corrette * 100.0) / set.size);
printf("Risposte corrette: %d%%\n", percentuale); printf("Risposte corrette: %.2f%%\n", percentuale);
if (percentuale >= TOLLERANZA) if (percentuale >= TOLLERANZA)
return 1; return 1;
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.