我们要有一个概念,就是卷积核就是我们的w1,w12,w2
那么我们的5*5卷积核怎么表达,当他在14*14的图像中流动时,对应的像素也在变化
这个和我们的上面w1,w12,w2不同,因为这几个都是全连接,比如,w1【0,0】对应图像第一像素和hi的第一个。
假定我们给5*5卷积核起名w1cnn,图像第一像素和hi的第一个对应w1cnn【0】,那么5*5卷积核走到第二个像素又用到了w1cnn【0】,w1cnn应该有25个,即w1cnn【0-24】
我们backward时,求应该对应哪个像素?
我们先用这一个5*5卷积核,捋一下forward:
14*14(w1cnn【25】)-》10*10(2*2池化,取最大)-》5*5-》80-》10,期望d【10】
14*14图像x第一个像素即x【0】所在位置5*5方阵像素与5*5的卷积核(w1cnn【25】)生成了10*10图像temphicnn的第一个像素。
我们用公式描述一下:
temphicnn【0】+=x[i=j=0,5*5方阵像素]*w1cnn[0-24],
temphicnn【1】+=x[i=1,j=0,5*5方阵像素]*w1cnn[0-24],
。。。。。。。。
这样重复下去,我们就有100个temphicnn【0-99】图像,来自14*14图像x每一个像素卷积。
然后temphicnn【0-99】图像2*2池化,取最大,变成25个像素图像hicnn【0-24】。
这里要注意的是,我们要记录下这25个最大值图像,在10*10图像中的位置,以及在14*14图像中开始卷积的位置,我找到一个公式:如果在25个最大值图像中,i=3;j=4,池化时记录最大位置在(1,0)
那么在10*10中位置(j*2+0)*10+i*2+1
那么在14*14中开始卷积的位置(j*2+0)*14+i*2+1
这有什么用,都是为backward时方便,找哪一个x【?】值
当我们图像变成25hicnn,使用sigmod函数,得到25个hocnn,接下来就变成三层bpnet,即25-》80-》10
到了这里,我们看的就很明显:一个卷积核的cnn很像我们的四层bpnet神经网络。
四层网络backward时,公式:
=
=(yo[k]-d[k])*ds(yo[k])*w2【m,k】*ds(h2o[m])*w12【j,m】*ds(ho[j])*x[i]
我们这个卷积核公式怎么写?
=
=(yo[k]-d[k])*ds(yo[k])*w2【m,k】*ds(h2o[m])*w12【j,m】*ds(hocnn[j])*x[i->?]
从上面分析,我们从j就能推出i,通过公式(h*2+0)*14+w*2+1,所以x【?】中这个问号就能定下来!
当你习惯了全连接,突然变成这一种,一般情况思路转不过来!
法宝就一个,仔细的分析从前到后forward,从后到前backward,当你熟悉起来,就ok了!
公式推导,到了,就是,结果很明显,想是想不出来的!