#include <iostream>#include<stdlib.h>#include<math.h>using namespacestd;#defineInnode 2#defineHiddennode 10#defineOutnode 1#defineSample 4classbpnet{ Public: DoubleW1[hiddennode][innode]; DoubleW2[outnode][hiddennode]; DoubleB1[hiddennode]; DoubleB2[outnode]; Doublee; Doubleerror; DoubleLR; Bpnet (); ~bpnet (); voidinit (); DoubleRandval (DoubleLowDoubleHigh ); voidINITW (DoubleW[],intN); voidTrainDoubleP[sample][innode],DoubleT[sample][outnode]); DoubleSigmod (Doubley); DoubleDsigmod (Doubley); voidPredictDoublep[]);};DoubleBpnet::d sigmod (Doubley) { returny* (1-y);}DoubleBpnet::sigmod (Doubley) { return 1.0/ (1+ EXP (-y));}DoubleBpnet::randval (DoubleLowDoubleHigh ) { DoubleVal; Val= ((Double) rand ()/(Double) rand_max) * (high-low) +Low ; returnVal;}voidBPNET::INITW (DoubleW[],intN) { for(inti =0; I < n; i++) {W[i]= Randval (-0.01,0.01); }}voidBpnet::init () {INITW (Double*) W1, hiddennode*Innode); INITW ((Double*) W2, hiddennode*Outnode); INITW (B1, Hiddennode); INITW (B2, Outnode);}voidBpnet::train (DoubleP[sample][innode],DoubleT[sample][outnode]) { DoubleHiddenerr[hiddennode]; DoubleOuterr[outnode]; DoubleHiddenin[hiddennode]; DoubleHiddenout[hiddennode]; DoubleOutin[outnode]; DoubleOutout[outnode]; DoubleX[innode]; DoubleD[outnode]; for(intK =0; K < sample; k++) { for(inti =0; i < Innode; i++) {X[i]=P[k][i]; } for(inti =0; i < Outnode; i++) {D[i]=T[k][i]; } for(inti =0; i < Hiddennode; i++) {Hiddenin[i]=0.0; for(intj =0; J < Innode; J + +) {Hiddenin[i]+ = w1[i][j] *X[j]; } Hiddenout[i]= Sigmod (Hiddenin[i] +B1[i]); } for(inti =0; i < Outnode; i++) {Outin[i]=0.0; for(intj =0; J < Hiddennode; J + +) {Outin[i]+ = w2[i][j] *Hiddenout[j]; } Outout[i]= Sigmod (Outin[i] +B2[i]); } for(inti =0; i < Outnode; i++) {Outerr[i]= (D[i]-outout[i]) *Dsigmod (Outout[i]); for(intj =0; J < Hiddennode; J + +) {W2[i][j]+ = lr*outerr[i] *Hiddenout[j]; } } for(inti =0; i < Hiddennode; i++) {Hiddenerr[i]=0.0; for(intj =0; J < Outnode; J + +) {Hiddenerr[i]+ = w2[j][i] *Outerr[j]; } Hiddenerr[i]= Hiddenerr[i] *Dsigmod (Hiddenout[i]); for(intj =0; J < Innode; J + +) {W1[i][j]+ = lr*hiddenerr[i] *X[j]; } } for(inti =0; i < Outnode; i++) {e+ = POW ((d[i]-outout[i]),2); } Error= E/2.0; for(inti =0; i < Outnode; i++) {B2[i]=lr*Outerr[i]; } for(inti =0; i < Hiddennode; i++) {B1[i]=hiddenerr[i] *LR; } }}voidBpnet::p redict (Doublep[]) { DoubleHiddenin[hiddennode]; DoubleHiddenout[hiddennode]; DoubleOutin[outnode]; DoubleOutout[outnode]; DoubleX[innode]; for(inti =0; i < Innode; i++) {X[i]=P[i]; } for(inti =0; i < Hiddennode; i++) {Hiddenin[i]=0.0; for(intj =0; J < Innode; J + +) {Hiddenin[i]+ = w1[i][j] *X[j]; } Hiddenout[i]= Sigmod (Hiddenin[i] +B1[i]); } for(inti =0; i < Outnode; i++) {Outin[i]=0.0; for(intj =0; J < Hiddennode; J + +) {Outin[i]+ = w2[i][j] *Hiddenout[j]; } Outout[i]= Sigmod (Outin[i] +B2[i]); } for(inti =0; i < Outnode; i++) {cout<<"The prediction is"<<outout[i] <<Endl; }}bpnet::bpnet () {e=0.0; Error=1.0; LR=0.4;} Bpnet::~bpnet () {}DoubleX[sample][innode] = { {1,1}, {1,0}, {0,1}, {0,0}};DoubleY[sample][outnode] = { {1}, {0}, {0}, {1}};intMain () {bpnet bp; Bp.init (); intTimes =0; while(Bp.error >0.001&× <10000) {BP.E=0.0; Times++; Bp.train (X, Y); } Doublem[2] = {0,1 }; Bp.predict (m); return 0;}
Implementation of BP Neural network C + +