卷积神经网络系列(3)——向前、向后传播

来源于油管视频
卷积层的前向传播
对于卷积层的前向传播来说,首先,我们需要有一个输入,在这里x就表示输入,这里的输入是4维的,为什么是4维的呢?
我们通常在写代码的时候把x表示成x[n,c,h,w],第一个n代表输入样本的编号,比如在这里指定了0,因为每次输入都是一个batch一个batch进行输入的,这里取了batch里面的第0个编号;第二个参数C代表了channel,如果是彩色图,有RGB3个channel,如果是灰度图,就是1个channel;第三、四个维度就是输入图像的高和宽。
然后,我们需要指定filter的深度为3,注意:这里我们的filter是有深度的,它的深度是和输入的RGB通道数保持一致的对于R、G、B三个区域,分别有1个filter进行卷积计算,再加上偏置项,得到特征图上的1个值,再通过不断滑动窗口得到第一个特征图(上图中的第一个activation maps),这里我们还指定了有3个filter,那么就会相应的得到后面两个特征图。
卷积层的后向传播对于,假如经过一个卷积层之后,我们会得到一个out。后向传播的目的就是要来更新参数w,d_w=d_out×x,d_out是上一层传下来的梯度,x是out对w的梯度,out=x`w+b。
下面来看一些,d_w该怎么计算呢?
**注意:我们最终计算出来的d_w和指定的filter尺寸是一样的。**一个out值对应着原始的一个小区域,那么d_out就是用一个点乘以一个区域,现在我们的深度是3,那么d_w的深度也是3,我们需要分别计算。在前向传播的过程中,我们是A×B=C,那么对应反向传播,我们就让C×B=A,这里的A就是d_w.通过图片下方的公式,我们可以看到,先找到了dout[0,0,0],x[0,0,:3,:3]中的第1个0代表索引,第2个0代表第0个通道,后面的:3代表取了从0到3这个小区域;接着区域开始滑动,用d_out[0,0,1]×x[0,0,:3,2:5],最终把不同的值和对应的区域相乘得到了多个区域的值,再把区域的值加起来就完成了第0层的深度的filter的反向计算。
池化反向传播
如果前向传播的矩阵为[1,3;2,2],经过mean pooling后得到的是2,那么反向传播的时候就直接把2平均。
如果前向传播的矩阵为[1,3;2,2],经过max pooling后得到的是3,那么反向传播的时候就把值最大的位置改成3,其他的位置是0。

猜你喜欢

转载自blog.csdn.net/weixin_44987948/article/details/109156010
今日推荐