
void CBP_TView::OnBpLearn()
{
Simu(); //获得网络输入 out0[i][0] 和参考输出 targ[i][0]
Random_w(); //随机获得网络初始权值
BeginWaitCursor();
double sum, dw;
for (q=0; q<nRepeat; q++) // nRepeat: 最大重复次数
{
for (p = 0; p < nLp; p++) //nLp = st/dt, Simu()中得到
{
Work(p); //网络输出计算
//计算反向传播的 delta
for (i = 0; i < nOut; i++) //输出层 delta = (targ-y)*y*(1-y)
delta2[p][i] = (targ[p][i] - out2[p][i])*out2[p][i]*(1.0-out2[p][i]);
for(int h = 0; h <nHide; h++)
{ //隐层
ohouthh
wyy
)1(
sum = 0;
for(j = 0;j < nOut;j++) sum+=delta2[p][j]*w2[j][h];
delta1[p][h] = sum*out1[p][h]*(1.0-out1[p][h]);
}
}
//调整隐层-输出层权值
for ( j=0;j<nOut;j++)
{
sum = 0;
for(p = 0; p<nLp; p++) sum+=delta2[p][j];
//得到每个输出节点的偏置的权值 w(nHide),
// eta: 学习率, alpha: 动量因子
dw = eta*sum + alpha*delw2[j][nHide]; //
w2[j][nHide] += dw; //
delw2[j][nHide] = dw; //
//得到其它的权值
for (h = 0; h < nHide; h++)
{ sum = 0;
for(p = 0; p < nLp; p++)
sum+=delta2[p][j]*out1[p][h];
dw = eta*sum + alpha*delw2[j][h];
w2[j][h] += dw;
delw2[j][h] = dw;
}
}
//调整输入层-隐层权值
for (h= 0;h < nHide; h++)
{
sum = 0;
for (p = 0; p < nLp; p++) sum += delta1[p][h];
//得到每个隐层节点的偏置的权值 w(nIn) ,
//eta: 学习率, alpha: 动量因子
dw = eta*sum+alpha*delw1[h][nIn];
w1[h][nIn] += dw;
delw1[h][nIn] = dw;
//得到其它的权值
for(i = 0; i < nIn; i++)
{ sum = 0;
for (p = 0; p < nLp; p++) sum+=delta1[p][h]*out0[p][i];
dw = eta*sum+alpha*delw1[h][i];
w1[h][i]+=dw;