📄 bp.cpp~
字号:
#include<math.h>#include<iostream>#define HIDDENNO 15#define INPUTNO 20#define OUTNO 20#define NP 1double weight1[HIDDENNO][INPUTNO];double weight2[OUTNO][HIDDENNO];double outhidden[NP][HIDDENNO];double outinput[NP][INPUTNO];double outout[NP][OUTNO];double deltahidden[NP][HIDDENNO];double deltaout[NP][OUTNO];double delw1[HIDDENNO][INPUTNO];double delw2[OUTNO][HIDDENNO];double target[NP][HIDDENNO];double differ[NP][OUTNO];int main(){ float eta = 0.75,alpha = 0.075,scale = RAND_MAX,wmax = 0.8,y0 = 0.5,t1 = 0.4; int h,i,j; int p,q,iter = 1200; double erms,sum1; /************************ weight initialization ******************************/ std::cout << "random weight1 matrx initialization is in progress:\n"; for(i = 0;i < HIDDENNO;i++){ for(j = 0;j < INPUTNO;j++){ float frand = std::rand(); float wtemp = wmax * (1.0 - frand / scale); weight1[i][j] = wtemp; } } std::cout << "weight1 done!\n\n"; std::cout << "random weight2 matrx initialization is in progress:\n"; for(i = 0;i < OUTNO;i++){ for(j = 0;j < HIDDENNO;j++){ float frand = std::rand(); float wtemp = wmax * (1.0 - frand / scale); weight2[i][j] = wtemp; } } std::cout << "weight2 done!\n\n"; /************************ weight initialization ******************************/ /********************* delta weight initialization ***************************/ std::cout << "delta weight initialization is in progress:\n"; for(i = 0;i < HIDDENNO;i++){ for(j = 0;j < INPUTNO;j++){ delw1[i][j] = 0; } } for(i = 0;i < OUTNO;i++){ for(j = 0;j < HIDDENNO;j++){ delw2[i][j] = 0; } } std::cout << "delta weights havd been set to zero!\n\n"; /********************* delta weight initialization ***************************/ /************************* input initialization ******************************/ std::cout << "input initialization is in progress:\n"; for(p = 0;p < NP;p++){ for(i= 0;i < INPUTNO;i++){ outinput[p][i] = static_cast<double>(i)/20.0; } } std::cout << "input done!\n\n"; /************************* input initialization ******************************/ /************************ expect initialization ******************************/ std::cout << "expect output initialization is in progress:\n"; for(p = 0;p < NP;p++){ for(i = 0;i < OUTNO;i++){ target[p][i] = (t1 * sin((2 * 3.1415926) * (outinput[p][i]))) + y0; } } std::cout << "expect done!\n\n"; /************************ expect initialization ******************************/ /*********************************** start ***********************************/ for(q = 0;q < iter;q++){ for(p = 0;p < NP;p++){ for(h = 0;h < HIDDENNO;h++){ float sum = weight1[h][INPUTNO]; for(i = 0;i < INPUTNO;i++){ sum = sum + weight1[h][i] * outinput[p][i]; } outhidden[p][h] = 1.0 / (1.0 + exp(-sum)); } for(j = 0;j < OUTNO;j++){ float sum = weight2[j][HIDDENNO]; for(h = 0;h < HIDDENNO;h++){ sum = sum + weight2[j][h] * outhidden[p][h]; } outout[p][j] = 1.0 / (1.0 + exp(-sum)); } for(j = 0;j < OUTNO;j++){ deltaout[p][j] = (target[p][j] - outout[p][j])*outout[p][j]*(1.0 - outout[p][j]); } for(h = 0;h < HIDDENNO;h++){ float sum = 0.0; for(j = 0;j < OUTNO;j++){ sum = sum + deltaout[p][j]*weight2[j][h]; } deltahidden[p][h] = sum * outhidden[p][h] * (1.0 - outhidden[p][h]); }// the second p appeared........................ for(j = 0;j < OUTNO;j++){ float dw =0.0,sum = 0.0; for(p = 0;p < NP;p++){ sum = sum + deltaout[p][j]; } dw = eta * sum + alpha * delw2[j][HIDDENNO]; weight2[j][HIDDENNO] += dw; delw2[j][HIDDENNO] = dw;// suanxin quan zhi w2 for(h = 0;h < HIDDENNO;h++){ float sum = 0.0; for(p = 0;p < NP;p++){ sum = sum + deltaout[p][j]*outhidden[p][h]; } dw = eta * sum + alpha * delw2[j][h]; weight2[j][h] += dw; delw2[j][h] = dw; } }//tiao jie shi ru ceng de quanzhi for(h = 0;h < HIDDENNO;h++){ float sum = 0.0,dw = 0.0; for(p = 0;p < NP;p++){ sum = sum + deltahidden[h][j]; } dw = eta * sum + alpha * delw1[h][INPUTNO]; weight1[h][INPUTNO] += dw; delw1[h][INPUTNO] = dw; for(i = 0;i < INPUTNO;i++){ float sum = 0.0; for(p = 0;p < NP;p++){ sum = sum + deltahidden[p][i] * outinput[p][i]; } dw = eta * sum + alpha * delw1[h][i]; weight1[h][i] += dw; delw1[h][i] = dw; } } } } for(p = 0;p < NP;p++){ float sum = 0.0; for(j = 0;j < OUTNO;j++){ differ[p][j] = fabs(outout[p][j] - target[p][j]); } for(j = 0;j < OUTNO;j++){ sum = sum + differ[p][j]*differ[p][j]; } erms = sqrt(0.05)*sqrt(sum); } std::cout << erms << ",";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -