反卷积的两种方式

转载自: https://blog.csdn.net/Fate_fjh/article/details/52882134c

full mode卷积

卷积中的full模式,在步长小的时候会出现卷积后的结果比原图size大的情况。

多出来的部分根据实际情况可以有不同的处理方法。这种操作其实是一种反卷积。

 

另一种反卷积的方法

反卷积,可以理解为卷积操作的逆运算。这里千万不要当成反卷积操作可以复原卷积操作的输入值,反卷积并没有那个功能,它仅仅是将卷积变换过程中的步骤反向变换一次而已,通过将卷积核转置,与卷积后的结果再做一遍卷积,所以它还有个名字叫转置卷积。
虽然它不能还原出原来卷积的样子,但是在作用上具有类似的效果,可以将带有小部分缺失的信息最大化恢复,也可以用来恢复被卷积生成后的原始输入。
反卷积具体步骤如下:
1 首先是将卷积核反转(并不是转置,而是上下左右方向进行递序操作)。
2 再将卷积结果作为输入,做补0扩充操作,即往每一个元素后面补0.这一步是根据步长来的,对于每个元素沿着步长方向补(步长-1)个0。例如,步长为1就不用补0了。
3 在扩充后的输入基础上再对整体补0。以原始输入的shape作为输出,按照前面介绍的卷积padding规则,计算pading的补0的位置及个数,得到补0的位置及个数,得到补0的位置要上下和左右各自颠倒一下。
4 将补0后的卷积结果作为真正的输入,反转后的卷积核为filter,进行步长为1的卷积操作。
注意:计算padding按规则补0时,统一按照padding='SAME'、步长为1*1的方式来计算。

反卷积的两种方式_第1张图片

上图上面部分展示:以一个[1,4,4,1]的矩阵为例,进行filter为2*2,步长为2*2的卷积操作。
其反卷积操作步骤如上图下半部分。
在反卷积过程中,首先将2*2矩阵通过步长补0的方式变成4*4,再通过padding反方向补0,然后与反转后的filter使用步长为1*1的卷积操作,最终得出结果。但是这个结果已经与原来的全1矩阵不等了,说明转置卷积只能恢复部分特征,无法百分百的恢复原始数据。
--------------------- 
原文:https://blog.csdn.net/chengqiuming/article/details/80299432 

与上图的full卷积相比,把四周padding 0变成了在像素中间插入0,如下图所示:

假设原图是3X3,首先使用上采样让图像变成7X7,可以看到图像多了很多空白的像素点。使用一个3X3的卷积核对图像进行滑动步长为1的valid卷积,得到一个5X5的图像,我们知道的是使用上采样扩大图片,使用反卷积填充图像内容,使得图像内容变得丰富,这也是CNN输出end to end结果的一种方法。其不同层上采样与反卷积变化效果如下,

总结

目前使用得最多的deconvolution有2种,上文都已经介绍。
方法1:full卷积, 可以使得原图变大
方法2:先扩大空间(有记录pooling index的方法),再用卷积填充

 

直观的理解反卷积:

图像的deconvolution过程如下,

输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7
即输入为2x2的图片经过4x4的卷积核进行步长为3的反卷积的过程
1. 输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为 1+4-1=4, 即4x4大小的特征图,输入有4个像素所以4个4x4的特征图
2. 将4个特征图进行步长为3的fusion(即相加); 例如红色的特征图仍然是在原来输入位置(左上角),绿色还是在原来的位置(右上角),步长为3是指每隔3个像素进行fusion,重叠部分进行相加(为什么不是取平均或者任取一个,防止棋盘格效应呢?可能是不容易实现么?),即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。

可以看出反卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小
得到 out = (in - 1) * s + k
上图过程就是, (2 - 1) * 3 + 4 = 7
--------------------- 
作者:Fate_fjh 
来源:CSDN 
原文:https://blog.csdn.net/Fate_fjh/article/details/52882134 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(深度学习,深度学习基础理论)