Backpropagation in C + +
Po priporočilu so kolegi zbornik, sem reposting to vprašanje tukaj.
Jaz nikoli ne more zdeti se zadobiti backpropagation pravico, in vsakič, ko sem prositi za pomoč, nihče ne zdi, da lahko sprejmete ali njihove predloge, ne rešitev problema. Torej, sem mislil, da lahko zaprosi za pomoč drugo točko - moj razred brez backprop algoritem.
Ali lahko kdorkoli povej mi postopek za backpropagating, ki temelji na viru spodaj? Sem samo vedeti, kako bi backpropagation algoritem dela za moj razred setup (Ive 'been težaven zadobiti darned stvar za 2 leti, zdaj - jasno sem uporabljate napačen pristop).# include
# include
# includeRazred Nevron
(
javnosti:
** float input;
float * teža;
unsigned numInputs;
float proizvodnja;
float lutke, / / za vračanje slabo referencenevron (unsigned input_numInputs);
nevron ();
void obnovo (unsigned input_numInputs);
~ nevron ();
void setInput (nevron & n, unsigned inputIndex);
setInput void (float & floatInput, unsigned inputIndex);
float & getInput (unsigned inputIndex);
void recalc ();
void setWeight (unsigned inputIndex, float vrednost);
);Razred neuralNetwork
(
javnosti:
unsigned numInputLayer;
unsigned numHiddenLayer;
unsigned numInputs;
float * input;
Nevron * inputLayer;
Nevron * hiddenLayer;
Nevron outputLayer;neuralNetwork (unsigned input_numInputs, nepodpisane input_numInputLayer, unsigned input_numHiddenLayer);
~ neuralNetwork ();
);float XOR (float input1, input2 float, float biasLower = 0.0f, float biasUpper = 1.0f);
void nevron:: setWeight (nepodpisane inputIndex, float vrednost)
(
if (inputIndex> = numInputs)
return;
teža [inputIndex] = vrednost;
)
void nevron:: recalc ()
(
if (numInputs <= 0)
return;
float weightedInput = 0.0f;
for (unsigned i = 0; i = numInputs)
return;
še
input [inputIndex] = &floatInput;
)
float & nevron:: getInput (unsigned inputIndex)
(
if (inputIndex> = numInputs)
return (lutke);
še
return (input [inputIndex] [0]);
)
Nevron:: Nevron ()
(
numInputs = 0;
)
Nevron:: Nevron (unsigned input_numInputs)
(
numInputs = 0;
obnovo (input_numInputs);
)
void nevron:: obnovili (unsigned input_numInputs)
(
if (numInputs> 0)
(
zbrisati [] input;
zbrisati [] teže;
)
numInputs = input_numInputs;
input = new float * [numInputs];
teža = new float [numInputs];
)
Nevron:: ~ Nevron ()
(
if (numInputs> = 0)
(
brisanje vnosa;
brisanje teže;
)
)
void nevron:: setInput (nevron & n, unsigned inputIndex)
(
if (inputIndex> = numInputs)
return;
input [inputIndex] = & n.output;
)neuralNetwork:: neuralNetwork (nepodpisane input_numInputs, nepodpisane input_numInputLayer, unsigned input_numHiddenLayer)
(
nepodpisane i, j;
numInputs = input_numInputs;
numHiddenLayer = input_numHiddenLayer;
numInputLayer = input_numInputLayer;
input = new float [numInputs];
inputLayer = new nevron [numInputLayer];hiddenLayer = new nevron [numHiddenLayer];
outputLayer.rebuild (numHiddenLayer);
for (i = 0; i <numHiddenLayer; i + +)
(
hiddenLayer [i]. obnovo (numInputLayer);
outputLayer.setInput (hiddenLayer [i], i);
)
for (i = 0; i <numInputLayer; i + +)
(
inputLayer [i]. obnovo (numInputs);
for (j = 0; j <numHiddenLayer; j + +)
hiddenLayer [j]. setInput (inputLayer [i], i);
)
for (i = 0; i <numInputs; i + +)
for (j = 0; j 0)
brisanje vnosa;
if (numInputLayer> 0)
zbrisati [] inputLayer;
if (numHiddenLayer> 0)
zbrisati [] hiddenLayer;)
float XOR (input1 float, float input2, biasLower float, float biasUpper)
(
float correctedInput1, correctedInput2;
if (input1 <((biasLower + biasUpper) / 2.0f))
correctedInput1 = biasLower;
še
correctedInput1 = biasUpper;
if (input2 <((biasLower + biasUpper) / 2.0f))
correctedInput2 = biasLower;
še
correctedInput2 = biasUpper;
if (correctedInput1 == correctedInput2)
(
return (biasLower);
)
še
(
return (biasUpper);
)
)int main (int argc, char * argv [])
(
neuralNetwork nn (2,2,1);
cout << "Done!" <<endl;
getch ();
return 0;
)- Crash Matrix
Nadaljnje delo: Sledi backpropagation kodo uporabljam (ki, btw, ne deluje).
void neuralNetwork:: backpropagate (float target)
(
if (numInputs == 0 | | numInputLayer == 0 | | numHiddenLayer == 0)
return;
float deltaOutput;
float * deltaHidden = new float [numHiddenLayer];
nepodpisane i, j;
/ *
Upoštevajte, da obstajata dva izhoda uporabljen tukaj:
1) proizvodnja trenutne plasti določi delta vrednosti,
2) proizvodnja Nevron povezan vnos trenutno Nevron se uporablja v
prilagoditev za težo.
* /
/ / Ali output prvo plast
deltaOutput = (ciljno - outputLayer.output) * * outputLayer.output (1.0f - outputLayer.output);
for (i = 0; i <numHiddenLayer; i + +)
outputLayer.weight [i] + = learnRate * deltaOutput * hiddenLayer [i]. output;
/ / Zdaj pa skrite plasti
for (j = 0; j <numHiddenLayer; j + +)
(
deltaHidden [j] = outputLayer.weight [j] * deltaOutput *
hiddenLayer [j]. output * (1.0f - hiddenLayer [j]. output);
for (i = 0; i <numInputLayer; i + +)
(
hiddenLayer [j]. teža [i] + = deltaHidden [j] * learnRate * inputLayer [i]. output;
)
)
)In kako jaz prost dostop to je, kot sledi:
nepodpisane i, j, k;
neuralNetwork nn (2,2,1);
for (k = 0; k <100000; k + +)
(
for (i = 0; i <2; i + +)
for (j = 0; j <2; j + +)
(
nn.input [0] = (float) i;
nn.input [1] = (float) j;
nn.recalc ();
nn.backpropagate (XOR ((float) i, (float), j));
if (k == 0 | | k == 99999)
(
nn.recalc ();
cout <<i << "XOR" <<j < "<<nn.outputLayer.output <<" je treba "<<XOR ((float) i, (float), j) <<endl;
)
)
if (k == 0 | | k == 99999)
cout <<endl;
)Vem, jaz ne določajo natančno omejevalnik na njej. Ampak, nikoli ne pridejo vse rezultate bližje od 0,4 od 1,0 (nizke in visoke so 0,0 in 1,0 oziroma in realizacij nikoli ne gredo izven 0,45 in 0,55). Realizacij korak proti 1,0 in 0,0 (seveda), vendar ne.
Vse ideje, kaj je narobe?Oprostite, jaz zdaj imel druge spremembe, tako da so skriti teža prilagoditve niso vedno povsem enaka,
(kar bi bilo podobno imajo samo enega skrita teže)
zato sem tudi spremenila
hiddenLayer [j]. setInput (inputLayer [i], i);
do
(
hiddenLayer [j]. setInput (inputLayer [i], i);
hiddenLayer [j]. setWeight (i, 2,0 * rand () / RAND_MAX-1);
)





Recent Comments