参考conv_arithmetic上的动图
符号约定: i
,o
,k
,p
,s
分别表示:卷积的输入大小input size
,输出大小 output size
,卷积核大小 kernel size
, padding
, stride
。
下面的图片蓝色(底部)为输入,绿色(顶部)为输出。
1、常规卷积:
(1)、i=4
,o=2
,k=3
,p=0
,s=1
, "VALID模式"
(2)、
i=5
,o=5
,k=3
,p=1
,s=1
"SAME模式"
或者"HALF模式"
(3)、
i=5
,o=7
,k=3
,p=2
,s=1
"FULL模式"
(4)、
i=5
,o=2
,k=3
,p=0
,s=2
(5)、
i=5
,o=3
,k=3
,p=1
,s=2
2、反卷积/转置卷积:
(1)、i=2
,o=4
,k=3
,no_padding
,s=1
(2)、
i=5
,o=5
,k=3
,same_padding
,s=1
(3)、
i=7
,o=5
,k=3
,full_padding
,s=1
(4)、
i=2
,o=5
,k=3
,no_padding
,s=2
(5)、
i=3
,o=5
,k=3
,padding
,s=2
实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。
反卷积(转置卷积)通常用在以下几个方面:
- CNN可视化,通过反卷积将卷积得到的
feature map
还原到像素空间,来观察feature map
对哪些pattern
相应最大,即可视化哪些特征是卷积操作提取出来的; - FCN全卷积网络中,由于要对图像进行像素级的分割,需要将图像尺寸还原到原来的大小,类似
upsampling
的操作,所以需要采用反卷积; - GAN对抗式生成网络中,由于需要从输入图像到生成图像,自然需要将提取的特征图还原到和原图同样尺寸的大小,即也需要反卷积操作。
当反卷积的s = 1
时,反卷积和一般的卷积并没有什么不同,只是padding
的称呼方式有所变化,方向和卷积相反。由反卷积的图5可以看到反卷积的一些缺点,在s > 1
时,会降低图片的分辨率,并且不同于一般的convolution
,反而增大了输出的feature map
的size
。
对于s = 2
、padding=1
、k=4
的反卷积,输入AXA图像,输出为2AX2A。
3、膨胀卷积:
又称为空洞卷积
、扩张卷积
英文为:Dilation[daɪ'leɪʃn] Convolution
/Atrous['ətrəs] Convolution
/Convolution with holes
作用:
首先膨胀卷积的目的是为了在扩大感受野的同时,不降低图片分辨率
和不引入额外参数及计算量
(一般在CNN中扩大感受野
都需要使用s>1
的conv
或者pooling
,导致分辨率降低,减少了feature map的信息。如果使用大卷积核,确实可以达到增大感受野,但是会引入额外的参数及计算量)。
膨胀卷积多了一个参数dilation rate
, 指的是kernel
的间隔数量(e.g. 一般的convolution
的 dilatation rate = 1
)。把dilation rate
简记为r
。
图像参考:i = 7
,o = 3
,k = 3
,p = 0
,s = 1
,r = 2
扩充后的卷积核
size = k + (k-1) x (r-1)
,特别地,对于3*3的卷积核,如果p = r
,则特征图尺寸大小不改变。既然膨胀卷积的初衷之一就是不降低图片分辨率,那么我们可以认定膨胀卷积的s = 1
。总起来说,dilation conv是对卷积核进行upsample,deconv是对feature map进行upsample;或者说,dilation conv是skip掉map中的一些元素,而deconv是对map中的元素进行补0操作。
参考:
1、反卷积/转置卷积: transposed conv/deconv
2、彻底搞懂CNN中的卷积和反卷积
3、谈谈膨胀卷积
4、dilation conv 和 deconv
5、如何理解空洞卷积(dilated convolution)?-知乎