Oppure

Loading
30/12/11 0:35
web_pirate
Sinceramente non sapevo se aprire una discussione o una domanda. :asd: 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?
#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;
}
aaa
30/12/11 10:59
tasx
Ciao!

Se vuoi eiste una libreria comodissima e facilissima da usare: leenissen.dk/fann/wp/


ciaociao!!
aaa