PDA

Visualizza la versione completa : [C] Rete neurale per somma di numeri


azazelit
01-03-2009, 15:53
prende come input un file di esempio con 15 coppie di numeri e le 15 rispettive somme
secondo me ho sbagliato qualcosa dal punto di vista del calcolo dei delta da applicare alle varie sinapsi.....HEEEEELP

#include <stdio.h>
#include<stdlib.h>
#include <math.h>
FILE *addestrare, *sinapsi;
double e = 2.71828;
float des;
float sommainput(int, int);
float sommaerrori(int);


struct neurone
{
float input;
float output;
};

struct neurone input[2];
struct neurone hidden[4];
struct neurone output;


double collegamentoinputhidden[2][4], collegamentohiddenoutput[4], deltainputhidden[2][4], deltahiddenoutput[4],sommaerroripesati[4];
void main()
{

int i, k;
for(k=0; k<4; k++)
{
collegamentohiddenoutput[k] = 0.5;
for(i=0; i<2; i++)
{
collegamentoinputhidden[i][k] = 0.5;
}
}
double erres,errgl;
sinapsi = fopen("sinapsi.txt","w");
while(errgl>0.025)
{
errgl = 0;
int ind = 0;
addestrare = fopen("esempi.txt","r");
while(ind < 15)
{
ind++;

fscanf(addestrare,"%g %g %g",&input[0].input, &input[1].input, &des);
for(k = 0; k<2; k++)
{
input[k].output= 1/(1+pow(e, -input[k].input));
}
for(k = 0; k<4; k++)
{
hidden[k].input = sommainput(1, k);
hidden[k].output= 1/(1+pow(e, -hidden[k].input));
}
output.input = sommainput(2,0);
output.output = 1/(1+pow(e, -output.input));
double errin;
errin = (des - output.output);
for(k = 0; k<4; k++)
{
deltahiddenoutput[k] = 0.3*errin*output.output*(1-output.output)*hidden[k].output;
collegamentohiddenoutput[k] = collegamentohiddenoutput[k]+deltahiddenoutput[k];
}

for(k = 0; k<4; k++)
{
sommaerroripesati[k] = sommaerrori(k);
for(i=0; i<2; i++)
{
deltainputhidden[i][k] = 0.3*hidden[k].output*(1-hidden[k].output)*sommaerroripesati[k]*input[i].output;
collegamentoinputhidden[i][k] = collegamentoinputhidden[i][k] + deltainputhidden[i][k];
}
}
erres= (pow(des - output.output,2))/2;
errgl = errgl + erres;
}
errgl=errgl/15;
printf("l'errore e %g\n", errgl);
fclose(addestrare);

}

for(k = 0; k<4; k++)
{
fprintf(sinapsi, "%g\n", collegamentohiddenoutput[k]);
for(i = 0; i<2 ;i++)
fprintf(sinapsi, "%g\n",collegamentoinputhidden[i][k]);
}

/* provo con 2 numeri per vedere se funziona*/

input[0].input= 0.18;
input[1].input=0.52;
for(k = 0; k<2; k++)
{
input[k].output= 1/(1+pow(e, -input[k].input));
}
for(k = 0; k<4; k++)
{
hidden[k].input = sommainput(1, k);
hidden[k].output= 1/(1+pow(e, -hidden[k].input));
}
output.input = sommainput(2,0);
output.output = 1/(1+pow(e, -output.input));
fprintf(sinapsi, "18+12=%g", output.output*100);
}



float sommainput(int level, int numero)
{
int i;
float iput = 0;
if (level == 1)
{
for(i= 0; i<2; i++)
iput = iput + input[i].output*collegamentoinputhidden[i][numero];
}
if(level == 2)
{
for(i= 0; i<4; i++)
iput = iput + hidden[i].output*collegamentohiddenoutput[i];
}
return iput;
}
float sommaerrori(int numero)
{

float erroripesati = 0;
erroripesati = (des - output.output)*output.output*(1-output.output)*collegamentohiddenoutput[numero];
return erroripesati;
}

alka
01-03-2009, 16:15
E' impossibile risponderti in questi termini.

Prima di tutto, inserisci il codice all'interno del tag "CODE", in modo che sia pił leggibile, e riporta solo la parte di codice che riguarda l'errore riscontrato, spiegando dettagliatamente il problema, o l'errore, senza costringere chi legge a prendere tutto il codice, a compilarlo e a testarlo autonomamente per capirlo.

Loading