код с грешки

3 отговора 276 прегледа
#1

код с грешки

Много грозно написан код, ама толкоз мога, сори. Имам въпрос-молба: като го пусна в този му вид и получавам един безкраен loop, а когато променя ония почервенените долу на float и получавам грешка - веднага ми изписва крайните стойности като безкрайност (или нещо такова)..Що така?
не мога да блъскам код и за това питам ако някой му се занимава да пусне на неговата машинка кода да ми каже същото ли става ...или пък направо да ми кажете очевадните грешки..
благодаря предварително...

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// 2-1-1 Backpropagation NNet

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

using namespace std;

int main(int argc, char *argv[])
{
// input values & target output values
float input[3][2]={{0.1, 0.8},
{0.2, 0.45},
{0.5, 0.6}};
float outputDesired[3]={1.8, 1.8, 1.8};


int ii=0, jj, maxIter;
float error=0.0;
float learnRate, tolerance;

double weightInput[2], weightHidden;
double outputHidden, output;

srand(time(NULL));
weightInput[0]=rand()/RAND_MAX;
weightInput[1]=rand()/RAND_MAX;
weightHidden=rand()/RAND_MAX;

printf("\n\tlearning rate between 0 and 1:\t");
scanf("%f", &learnRate);
printf("\n\terror tolerance:\t");
scanf("%f", &tolerance);
printf("\n\tMAX number of iterations:\t");
scanf("%f", &maxIter);
//train network
do{
//propagate inputs and change weights
for(jj=0;jj<3;jj++){
outputHidden=1/(1+exp(-input[jj][1]*weightInput[1]-input[jj][2]*weightInput[2]));
output=1/(1+exp(-outputHidden*weightHidden));
error=outputDesired[jj]-output;
if(error*error<=tolerance) break;
else{
//change weights as
//weight(old) + learning rate * output error * output(neurons i) * output(neurons i+1) * ( 1 - output(neurons i+1) )
weightHidden = weightHidden + learnRate*error*outputHidden*output*(1-output);
weightInput[1] = weightInput[1] + learnRate*error*(input[jj][1]*weightInput[1])*outputHidden*(1-outputHidden);
weightInput[2] = weightInput[2] + learnRate*error*(input[jj][2]*weightInput[2])*outputHidden*(1-outputHidden);
ii++;
}
}
if(ii>=maxIter){
printf("\nMAX iteration reached...");
break;
}
}while(error*error>=tolerance);
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=\n");
printf("\nConverged @ iteration %d", ii);
printf("\nError is %lf and weights are:\n", error);
printf("\n\tWEIGHTS1*={%lf, %lf}, WEIGHT.HIDDEN=%lf", weightInput[1], weightInput[2], weightHidden);
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=\n");

system("PAUSE");
return 0;
}
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

Отговор
в отговор на swan #2

Re: код с грешки

Priatelio kak mojesh da dostapvash weightInput[2] sled kato imash definicia za

weightInput[2]( tova e 3 indeks broeno ot nula ) , nali se seshtash za programista det broial vinagi ot nula ili ne sam prav ?????

Ne triaba li da promenish s edinica indeksiraneto ??

Inache sme ot edna poroda borim nevronni mreji samo che az Mashina na Boltzmann :-)

Отговор
в отговор на Toco #3

Re: код с грешки

упс...
благодарно, а невронните мрежи имам само теоретични познания и ги симулирам в R ама реших да видя кво става ако сам си ги правя функциите в С...далеч съм още от истината...

Отговор
в отговор на swan #4

Re: код с грешки

Имай предвид, че операциите в C са контекстно независими.
float R = 1/3; дава 0, а не 0.3..3 . Така че като имаш целочислени сметки и присвояваш на float трябва да правиш typecast.
float R = (float) 1/3;
Това ще кастне 1 до 1f, а от там и целия израз.
Разбира се може и 1f/3, ама в твоя случай не става, щото RAND_MAX вече си е дефинирано като цяло ( поне така предполагам, нямам C под ръка ).


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор