卷积神经网络cnn的关键函数forward与backward有一种对称之美:
蓝对蓝,黄对黄,如下:
public void forward()
{
//1,第一层卷积,卷积核使用顺序
z10 = a00 * wcnn00 + a01 * wcnn01 + a03* wcnn02 + a04* wcnn03;//0,1,3,4
z11 = a01 * wcnn00 + a02 * wcnn01 + a04 * wcnn02 + a05 * wcnn03;//1,2,4,5
z12 = a03 * wcnn00 + a04 * wcnn01 + a06 * wcnn02 + a07 * wcnn03;//3,4,6,7
z13 = a04 * wcnn00 + a05 * wcnn01 + a07 * wcnn02 + a08 * wcnn03;//4,5,7,8
//2, z1->aI,第二层输入
aI0 = sigmoid(z10);
aI1 = sigmoid(z11);
aI2 = sigmoid(z12);
aI3 = sigmoid(z13);
//3,第二层卷积,卷积核使用顺序
z2 = aI0 * wcnn10 + aI1 * wcnn11 + aI2* wcnn12 + aI3 * wcnn13 ;
aII = sigmoid(z2);
o = aII;
//4
double 偏差 = (1 - o) * (1 - o) * 1 / 2.0;
}
double E偏差zII = 0;
public void backward()
{
//4,E偏导zII =e偏导aII*aII偏导zII
E偏导zII = -(1 - o) * dsigmoid(o); //计算偏差向前传播卷积核
//3,计算w【1】的梯度,第二层,偏差向前传播卷积核->E偏导zII的卷积动作
//E偏导zII *zII偏导w1
wcnn的偏差10 = E偏导zII * aI0;
wcnn的偏差11 = E偏导zII * aI1;
wcnn的偏差12 = E偏导zII * aI2;
wcnn的偏差13 = E偏导zII * aI3;
//2,e偏导z1=e偏导a1*a1偏导z1
double delta11 = E偏导zII * wcnn10*dsigmoid(aI0); //计算偏差向前传播卷积核
double delta12 = E偏导zII * wcnn11*dsigmoid(aI1);
double delta21 = E偏导zII * wcnn12*dsigmoid(aI2);
double delta22 = E偏导zII * wcnn13 * dsigmoid(aI3);
//1,计算w【0】的梯度,第一层,偏差向前传播卷积核->delta卷积动作
//e偏导z1 *zI偏导w0
wcnn的偏差00 = delta11*a00 + delta12*a01 + delta21*a03 + delta22*a04;//0,1,3,4
wcnn的偏差01 = delta11*a01 + delta12*a02 + delta21*a04 + delta22*a05;//1,2,4,5
wcnn的偏差02 = delta11*a03 + delta12*a04 + delta21*a06 + delta22*a07;//3,4,6,7
wcnn的偏差03 = delta11*a04 + delta12*a05 + delta21*a07 + delta22*a08;//4,5,7,8
//0,更新
//w1,第二层的一个卷积核
for (int i = 0; i < 4; i++)
{
wcnn1i = wcnn1i - 常数a * wcnn的偏差1i;
}
//w0,第一层的一个卷积核
for (int i = 0; i < 4; i++)
{
wcnn0i = wcnn0i - 常数a * wcnn的偏差0i;
}
}


