web_pirate (Normal User)
Rookie
Messaggi: 51
Iscritto: 27/12/2011
|
Sinceramente non sapevo se aprire una discussione o una domanda. Se ho sbagliato mi scuso in anticipo. Salve a tutti, sono nuovo nel forum. Da un mesetto sto cercando di scrivere un programma che sfrutti una rete neurale e che riesca ad addestrarsi con un set di esempi. Così, per prova, ho cercato di scriverne una che impara a fare le somme. Il programma sembra funzionare, ma quando passo i diversi esempi alcuni la rete li svolge e il risultato e minimo, mentre altri hanno un errore che supera addirittura le 10 unità. Quale potrebbe essere il problema?
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <math.h> #define n_es 10 #define n_in 2 #define n_h 3 #define LEARN_RATE 0.5 float input[n_in]; float w_x_h[n_in][n_h]; float bias_x[n_h]; float d_x_h[n_h]; float neur_h[n_h]; float w_h_y[n_h]; float bias_y=0.1; float d_h_y; float err_out, err_h[n_h], global_err; float es_in[n_es][n_in], es_out[n_es]; float max_n=1; float sig(float x){ return 1/(1+pow(M_E, -x)); } float return_rete(float *input){ int i, j; float somma=0; float output; for(i=0;i<n_h;i++){ neur_h[i]=0; } for(i=0;i<n_in;i++){ for(j=0;j<n_h;j++){ neur_h[j]+=input[i]*w_x_h[i][j]; } } for(i=0;i<n_h;i++){ neur_h[i]+=bias_x[i]; neur_h[i]=sig(neur_h[i]); } output=0; for(i=0;i<n_h;i++){ output+=neur_h[i]*w_h_y[i]; } output+=bias_y; output=sig(output); return output; } void set_w(){ int i, j; for(i=0;i<n_in;i++){ for(j=0;j<n_h;j++){ w_x_h[i][j]=0.2; w_h_y[j]=0.2; } } } void set_d(){ int i, j; for(j=0;j<n_h;j++){ d_x_h[j]=0; } } float aggiusta_peso(float peso, float delta, float learning_rate, float in){ return peso+(delta*learning_rate*in); } float max(float *arr){ int i; float max1=1; bias_x[0]=0.5; bias_x[1]=0.5; bias_x[2]=0.5; for(i=0;i<n_es;i++){ if(arr[i]>max1){ max1=arr[i]; } } return max1; } int main(){ int i, j, y, e; float output; float prova[2]; for(i=0;i<n_es;i++){ es_in[i][0]=rand() % 100; es_in[i][1]=rand() % 100; es_out[i]=es_in[i][0]+es_in[i][1]; } max_n=max(es_out); for(i=0;i<n_es;i++){ es_in[i][0]=es_in[i][0]/max_n; es_in[i][1]=es_in[i][1]/max_n; es_out[i]=es_out[i]/max_n; } for(e=0;e<3000;e++){ printf("\n"); global_err=0; for(y=0;y<n_es;y++){ for(i=0;i<n_in;i++){ input[i]=es_in[y][i]; } output=return_rete(input); err_out=es_out[y]-output; d_h_y=err_out*(output*(1-output)); for(i=0;i<n_h;i++){ err_h[i]=d_h_y*w_h_y[i]; } set_d(); for(j=0;j<n_h;j++){ d_x_h[j]+=err_h[j]*(neur_h[j]*(1-neur_h[j])); } for(i=0;i<n_h;i++){ w_h_y[i]=aggiusta_peso(w_h_y[i], d_h_y, LEARN_RATE, neur_h[i]); } bias_y+=LEARN_RATE*d_h_y; for(i=0;i<n_in;i++){ for(j=0;j<n_h;j++){ w_x_h[i][j]=aggiusta_peso(w_x_h[i][j], d_x_h[j], LEARN_RATE, input[i]); } } for(i=0;i<n_h;i++){ bias_x[i]+=LEARN_RATE*d_x_h[i]; } printf("\n%f + %f = %f (%f)", es_in[y][0]*max_n, es_in[y][1]*max_n, return_rete(es_in[y])*max_n, es_out[y]*max_n); } } prova[0]=55/max_n; prova[1]=55/max_n; printf("\n"); printf("55 + 55 = %f\n", return_rete(prova)*max_n); return 0; }
|
|