卷积convolution,卷积反向传播BP of convolution,反卷积详解DeConv / TransposeConv

1. 卷积

1.1 卷积gif

卷积convolution,卷积反向传播BP of convolution,反卷积详解DeConv / TransposeConv_第1张图片 卷积convolution,卷积反向传播BP of convolution,反卷积详解DeConv / TransposeConv_第2张图片
No padding, no strides Arbitrary padding, no strides Half padding, no strides Full padding, no strides
 
No padding, strides Padding, strides Padding, strides (odd)  

已no padding,no stride为例,具体来看,卷积可以解释如下图

下图中O即为卷积所对应的输出,X表示输入,F表示卷积核(filter)。所以有:

1.2 卷积代码如何实现(caffe)

知道了如何计算卷积所对应的输出,那么如何用代码实现呢?

不同于直观的“滑动窗”方式,caffe中使用 im2col 方法实现卷积。过程如下图:

preview

那这样做的好处是什么呢?

这里直接贴出caffe作者贾扬清大神的ppt。(其中,GEMM指的是General Matrix to Matrix Multiplication,使用了BLAS库作为底层矩阵运算的实现。能力有限,继续深究可以google)

卷积convolution,卷积反向传播BP of convolution,反卷积详解DeConv / TransposeConv_第3张图片

2. 卷积反向传播

2.1 计算Filter的梯度

根据连式法则可得,Filter的梯度为:

其中,\frac{\partial E}{\partial O} 即为反传回来的,卷积输出的梯度。

可以看出,其值等价于做如下图所示的卷积操作:

这样就将卷积的反传过程转换为另一个卷积的过程了。

2.2 计算输入X的梯度

同理,根据连式法则,可以得到X的梯度为:

同样,设法用将其转化为另一个卷积操作。下面的卷积过程就是通常所说的卷积反传过程,也被称为转置卷积。具体如下图所示:

需要注意的有两点:

1) 首先,需要对输出O的梯度做zero padding,然后在进行卷积。

2) 然后,需要对卷积核F做旋转180度的操作

这样就得到了X的梯度

3. 反卷积,转置卷积

Deconv 和 transpose conv 多被用于Decoder的网络结构里,本质上是要进行up sampling。原理和方法跟卷积的反传过程一样。这里不具体分析,贴出部分gif。

N.B.: Blue maps are inputs, and cyan maps are outputs.

No padding, no strides, transposed Arbitrary padding, no strides, transposed Half padding, no strides, transposed Full padding, no strides, transposed
卷积convolution,卷积反向传播BP of convolution,反卷积详解DeConv / TransposeConv_第4张图片  
No padding, strides, transposed Padding, strides, transposed Padding, strides, transposed (odd)

补充

1. 此文讲解部分,考虑的均为stride为1的情况,其他stride或padding的情况原理相同,只不过反传过程需要做不同的padding。

2. 空洞卷积(Dilated / Atrous Conv)gif如下:

No padding, no stride, dilation

参考

卷积、反卷积的GIF

Back Propagation in Convolutional Neural Networks — Intuition and Code

Forward And Backpropagation in Convolutional Neural Network.

知乎-caffe如何实现卷积-贾扬清的回答

 

你可能感兴趣的:(经验分享,深度学习,卷积,CNN)