卷积神经网络cnn的关键函数forward与backward有一种对称之美:

蓝对蓝,黄对黄,如下:

public void forward()
        {
            //1,第一层卷积,卷积核使用顺序
            z1[0] =  a0[0] * wcnn[0][0] +  a0[1] * wcnn[0][1] +  a0[3]* wcnn[0][2] +  a0[4]* wcnn[0][3];//0,1,3,4

            z1[1] = a0[1] * wcnn[0][0] + a0[2] * wcnn[0][1] + a0[4] * wcnn[0][2] + a0[5] * wcnn[0][3];//1,2,4,5

            z1[2] = a0[3] * wcnn[0][0] + a0[4] * wcnn[0][1] + a0[6] * wcnn[0][2] + a0[7] * wcnn[0][3];//3,4,6,7

            z1[3] = a0[4] * wcnn[0][0] + a0[5] * wcnn[0][1] + a0[7] * wcnn[0][2] + a0[8] * wcnn[0][3];//4,5,7,8
              

            //2, z1->aI,第二层输入
            aI[0] = sigmoid(z1[0]);
            aI[1] = sigmoid(z1[1]);
            aI[2] = sigmoid(z1[2]);
            aI[3] = sigmoid(z1[3]);

            //3,第二层卷积,卷积核使用顺序
           z2 =  aI[0] * wcnn[1][0] + aI[1] * wcnn[1][1] + aI[2]* wcnn[1][2] + aI[3] * wcnn[1][3]  ;

           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偏导w[1]
            wcnn的偏差[1][0] = E偏导zII * aI[0];
            wcnn的偏差[1][1] = E偏导zII * aI[1];
            wcnn的偏差[1][2] =
E偏导zII * aI[2];
            wcnn的偏差[1][3] = 
E偏导zII * aI[3];

    //2,e偏导z1=e偏导a1*a1偏导z1
    double delta11      = E偏导zII * wcnn[1][0]*dsigmoid(aI[0]);  //计算偏差向前传播卷积核
          double delta12   = E偏导zII * wcnn[1][1]*dsigmoid(aI[1]);  
             double delta21     = E偏导zII * wcnn[1][2]*dsigmoid(aI[2]);  
             double delta22 = E偏导zII * wcnn[1][3] * dsigmoid(aI[3]); 
          
            //1,计算w【0】的梯度,第一层,偏差向前传播卷积核->delta卷积动作

 //e偏导z1 *zI偏导w[0]
             wcnn的偏差[0][0] = delta11*a0[0] + delta12*a0[1] + delta21*a0[3] + delta22*a0[4];//0,1,3,4
            wcnn的偏差[0][1] =  
delta11*a0[1] + delta12*a0[2] + delta21*a0[4] + delta22*a0[5];//1,2,4,5
            wcnn的偏差[0][2] =  
delta11*a0[3] + delta12*a0[4] + delta21*a0[6] + delta22*a0[7];//3,4,6,7
            wcnn的偏差[0][3] =  
delta11*a0[4] + delta12*a0[5] + delta21*a0[7] + delta22*a0[8];//4,5,7,8
         
          
   

            //0,更新

            //w1,第二层的一个卷积核
            for (int i = 0; i < 4; i++)
            {
                wcnn[1][i] = wcnn[1][i] - 常数a * wcnn的偏差[1][i];
            }

            //w0,第一层的一个卷积核
            for (int i = 0; i < 4; i++)
            {
                wcnn[0][i] = wcnn[0][i] - 常数a * wcnn的偏差[0][i];
            }
           
        }

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐