【神经网络与深度学习】卷积与反卷积
1. 卷积与反卷积
如上图演示了卷积核反卷积的过程,定义输入矩阵为
- 卷积的过程为:
Conv(I,W)=O - 反卷积的过称为:
Deconv(W,O)=I (需要对此时的O 的边缘进行延拓 padding)
2. 步长与重叠
卷积核移动的步长(stride)小于卷积核的边长(一般为正方行)时,变会出现卷积核与原始输入矩阵作用范围在区域上的重叠(overlap),卷积核移动的步长(stride)与卷积核的边长相一致时,不会出现重叠现象。
- 在步长(stride)为 1 时,输出的大小为
(4−3+1)×(4−3+1)
现考虑其逆问题,原始输入矩阵为多大时,其与
- 步长(stride)为 1 时,
(x−3+1)×(x−3+1)=4×4
x=6
搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里。
先来规范表达
- 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核形状都为正方形,x和y轴方向的padding相同,stride也相同。
- 记号:
i,o,k,p,s 分别表示:卷积/反卷积的输入大小input size ,卷积/反卷积输出大小output size ,卷积/反卷积核大小kernel size ,padding ,stride 。 - 举例(如下左图):
输入X∈R(4,4) 矩阵,卷积核w∈R(3,3),padding=0,stride=1 的情况下,卷积的输出Y∈R(2,2) ,就记为i=4,o=2,k=3,p=0,s=1 。
推翻错误的理解
第一次看到deconv这个词,以为deconv的结果就是卷积的逆,觉得神奇,不禁产生了“哦?转置的卷积就可以求逆了吗?”这样的想法,然后在matlab里面实验求证,我还记得当时以为反卷积能够求逆,考虑到图片进行常规卷积操作输出大小又不可能变大(same/valid),于是我还假设反卷积输出大小不变,用了same padding和原核的转置作为反卷积配置,结果发现根本不是那么一回事好吗。
其实DL中的deconv,是一种上采样过程,举个比方:输入
所以啊deconv这个名字相当误导人呐!这在cs231n课程里也被吐槽过,大家现在更喜欢用transposed conv来表述反卷积。为了方便起见,后文就用反卷积这个词了。
第二个容易confused的地方,就是很多文章都说卷积核的转置就可以求反卷积,又陷入迷茫“就算把卷积核转置(或者左右翻转上下翻转),卷积后输出还是越来越小(或不变,至少不会增大)啊”……直到看到文献和相应的这个动画(其他动画在github-convolution arithmetic1)
卷积 |
反卷积 |
注意图中蓝色(下面)是输入,绿色(上面)是输出,卷积和反卷积在
这里说明了反卷积的时候,是有补0的,即使人家管这叫no padding(
然后就产生了第三个confuse:“补0了会不会有影响,还能通过反卷积近似输入
反卷积以及反向传播的过程
卷积和反卷积的过程在arXiv-A guide to convolution arithmetic for deep learning2写的非常详细,还有很多例子便于理解,在这里我就截图出重点来(ps.文中的figure2.1就是上图的左边)。剩下的例子请大家多看看原文,最好自己动手算一下,我也贴个我算的过程(
关于反向传播, 知乎-如何理解深度学习中的deconvolution networks3有详细的推导过程。
参考资料
Transposed Convolution, Fractionally Strided Convolution or Deconvolution
反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks for mid and high level feature learning)。随着反卷积在神经网络可视化上的成功应用,其被越来越多的工作所采纳比如:场景分割、生成模型等。其中反卷积(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution,Fractional Strided Convolution等等。
这篇文章的目的主要有两方面:
1. 解释卷积层和反卷积层之间的关系;
2. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。
## 卷积层
卷积层大家应该都很熟悉了,为了方便说明,定义如下:
- 二维的离散卷积(
- 方形的特征输入(
- 方形的卷积核尺寸(
- 每个维度相同的步长(
- 每个维度相同的padding (
下图表示参数为
下图表示参数为
从上述两个例子我们可以总结出卷积层输入特征与输出特征尺寸和卷积核参数的关系为:
其中
反卷积层
在介绍反卷积之前,我们先来看看卷积运算和矩阵运算之间的关系。
卷积和矩阵相乘
考虑如下一个简单的卷积层运算,其参数为
对于上述卷积运算,我们把上图所示的3×3卷积核展成一个如下所示的[4,16]的稀疏矩阵
我们再把4×4的输入特征展成[16,1]的矩阵
通过上述的分析,我们已经知道卷积层的前向操作可以表示为和矩阵
反卷积和卷积的关系
全面我们已经说过反卷积又被称为Transposed(转置) Convolution,我们可以看出其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。因为卷积层的前向反向计算分别为乘
下图表示一个和上图卷积计算对应的反卷积操作,其中他们的输入输出关系正好相反。如果不考虑通道以卷积运算的反向运算来计算反卷积运算的话,我们还可以通过离散卷积的方法来求反卷积(这里只是为了说明,实际工作中不会这么做)。
同样为了说明,定义反卷积操作参数如下:
- 二维的离散卷积(
N=2 ) - 方形的特征输入(
i′1=i′2=i′ ) - 方形的卷积核尺寸(
k′1=k′2=k′ ) - 每个维度相同的步长(
s′1=s′2=s′ ) - 每个维度相同的padding (
p′1=p′2=p′ )
下图表示的是参数为(
Fractionally Strided Convolution
上面也提到过反卷积有时候也被叫做Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。对于步长
参考
Is the deconvolution layer the same as a convolutional layer?