From 828fea5d6a4dc8e4db39f6c5dff3acc3ef7d6431 Mon Sep 17 00:00:00 2001 From: mirimatcode Date: Fri, 21 Feb 2025 00:32:54 +0100 Subject: [PATCH] ci sto lavorando, provare nuova discesa del gradiente --- classificatore_singolo | Bin 21304 -> 21304 bytes classificatore_singolo.c | 42 ++++++++++++++++++++++++++++++--------- percettroni.h | 24 +++++++++++++--------- tempCodeRunnerFile.c | 3 +++ 4 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 tempCodeRunnerFile.c diff --git a/classificatore_singolo b/classificatore_singolo index fc5b2c1a088a85dffcce662135ced21b363fd382..0719ddb268ebc821e169b759a505e1683a13f97f 100755 GIT binary patch delta 3022 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 errore quadratico medio: (risultato_esatto - previsione)^2 + Gradiente dell'errore rispetto all'attivazione = derivata(funzione_perdita) * derivata(sigmoide_out) + = -(risultato_esatto - previsione) * (sigmoide_out * (1 - sigmoide_out)) + + //Per ogni percettrone sugli altri layer: + - calcolare derivata della propria sigmoide + - gradiente dell'errore retropropagato = peso del ne + + */ gradienti[NUM_LAYERS-1][0] = (output_corretto - sigmoidi[NUM_LAYERS-1][0]); + errore_totale += gradienti[NUM_LAYERS-1][0]; correggi_layer_interni(&rete_neurale, gradienti, sigmoidi); correggi_layer_input(&rete_neurale.layers[0], gradienti, sigmoidi, set.istanze[indice_set].dati, NUM_LAYERS); @@ -81,9 +98,16 @@ void main() { { corrette++; } + + if(corrette == 4) { + printf("\tConvergo all'epoca %d\n", i); + break; + } } + + printf("Errore: %f\n", errore_totale); - printf("\tRisposte corrette: %d\n", corrette); + //printf("\tRisposte corrette: %d\n", corrette); if(corrette == set.size) { break; diff --git a/percettroni.h b/percettroni.h index 9943596..4012f68 100644 --- a/percettroni.h +++ b/percettroni.h @@ -52,15 +52,17 @@ ReteNeurale *caricaReteNeurale(const char*); //Questa funzione genera un valore reale random compreso nell'intervallo [-1, 1] double randomico() { // Genero numeri nell'intervallo [-1,1] - return (double)((rand() / RAND_MAX) * -1);//((double)(rand() % 101 * 0.01 * 2 ) -1); + return ((double)(rand() % 101 * 0.01 * 2 ) -1); } //Questa funzione inizializza il percettrone allocando la memoria in base al numero dei pesi che voglio ed inizializza il loro valore usando randomico() Percettrone inizializza_percettrone(int n_pesi) { Percettrone p; p.pesi = (double*) malloc(sizeof(double) * n_pesi); - for(int i = 0; i < n_pesi; i++) + for(int i = 0; i < n_pesi; i++) { p.pesi[i] = randomico(); + //printf("peso[%d]: %f\n",i, p.pesi[i]); + } p.bias = randomico(); @@ -113,6 +115,7 @@ Layer inizializza_layer(int n_percettroni, int n_pesi) { for(int i = 0; i < n_percettroni; i++) { layer.percettroni[i] = inizializza_percettrone(n_pesi); + } layer.size = n_percettroni; @@ -124,8 +127,11 @@ Layer inizializza_layer(int n_percettroni, int n_pesi) { double sigmoide_byte(Percettrone p, byte *valori, int n_input) { double sommatoria = 0.0; + //printf("valori: [%d][%d]", valori[0], valori[1]); + //printf("pesi: [%f][%f]", p.pesi[0], p.pesi[1]); + for(int i = 0; i < n_input; i++) { - sommatoria += ((double)valori[i] * p.pesi[i]); + sommatoria += (valori[i] * p.pesi[i]); } //printf("sommatoria= %f\n", sommatoria); double funzione = sommatoria + p.bias; @@ -196,9 +202,9 @@ void correggi_layer_interni(ReteNeurale *rete, double **gradienti, double **sigm for(int indice_percettrone = 0; indice_percettrone < rete->layers[indice_layer].size; indice_percettrone++) {//Numero percettroni for(int indice_peso = 0; indice_peso < rete->layers[indice_layer].percettroni[indice_percettrone].size; indice_peso++) {//Numero pesi - //gradienti[indice_layer][indice_percettrone] = gradienti[rete->size-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); - //rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); - rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[rete->size-1][0] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); + gradienti[indice_layer][indice_percettrone] = gradienti[rete->size-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); + rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); + //rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[rete->size-1][0] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); } rete->layers[indice_layer].percettroni[indice_percettrone].bias += (gradienti[indice_layer][indice_percettrone] * LRE); //printf("bias: %f\n", rete->layers[indice_layer].percettroni[indice_percettrone].bias); @@ -213,9 +219,9 @@ void correggi_layer_input(Layer *layer, double **gradienti, double **sigmoidi, b for(int indice_percettrone = 0; indice_percettrone < layer->size; indice_percettrone++) {//Numero percettroni for(int indice_peso = 0; indice_peso < layer->percettroni->size; indice_peso++) { //Numero pesi - //gradienti[indice_layer][indice_percettrone] = gradienti[n_layers-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); - //layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * inputs[indice_peso]); - layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[n_layers-1][0] * LRE * inputs[indice_peso]); + gradienti[indice_layer][indice_percettrone] = gradienti[n_layers-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); + layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * inputs[indice_peso]); + //layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[n_layers-1][0] * LRE * inputs[indice_peso]); } layer->percettroni[indice_percettrone].bias += (gradienti[n_layers-1][0] * LRE); } diff --git a/tempCodeRunnerFile.c b/tempCodeRunnerFile.c new file mode 100644 index 0000000..da3cc5d --- /dev/null +++ b/tempCodeRunnerFile.c @@ -0,0 +1,3 @@ +for(int indice_percettrone = 0; indice_percettrone < PERCETTRONI_LAYER_0; indice_percettrone++) { + printf("percettrone %d -> sigmoide: %f\n", indice_percettrone, sigmoidi[0][indice_percettrone]); + } \ No newline at end of file