卷积padding和反卷积原理探究

反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks for mid and high level feature learning)。随着反卷积在神经网络可视化上的成功应用,其被越来越多的工作所采纳比如:场景分割、生成模型等。其中反卷积(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution,Fractional Strided Convolution等等。

为了介绍反卷积 / 转置卷积的概念,本文先从卷积网络开始介绍。

1、卷积

卷积padding和反卷积原理探究_第1张图片

其实图像的卷积和信号系统中的卷积有类似性。在信号系统中,卷积的定义如下:

卷积padding和反卷积原理探究_第2张图片
卷积的过程就是把其中一个函数翻转后平移做乘法计算各个点的卷积值。那么在图像上卷积核就是g(x, y), 图像是f(x, y), 理论上就需要对卷积核g(x,y)进行上下左右翻转,但是我们在实际操作的时候为啥没有做翻转的动作呢?这是因为我们在training卷积神经网络时,初始卷积核是一个随机值/0值,卷积核的值是整个系统training的过程的产生的。既然初始值是随机的,是否翻转没有意义,最后整个系统损失函数值最小时得到的卷积核本质上就是翻转后的值的。从效果上说,卷积核可以看成是图像滤波器。
  • 带padding的单输入单输出通道卷积过程的动画如下:
  • 输入通道单输出通道卷积
  • 多输入通道多输出通道卷积

卷积往往会降低图片的大小,降维采集特征,属于下采样的一种,输出图像大小和这些参数关系如下:输入图片大小W,卷积核大小F,Padding大小P,Strides大小S,输出图像大小:

N = (W − F + 2P )/S+1

实践中Padding往往是深度学习平台自动算出来,比如Tensorflow提供了两种Padding模式,valid和same模式。valid模式下padding=0, 可能会有部分像素不参与卷积,same模式下通过周围补0来让所有像素都能参与卷积,平台会自动算出Padding值。

卷积的padding

在卷积核的移动过程中,不同的padding模式会造成不同的结果,padding模式有Full、Same、Valid三种。
Valid:

卷积padding和反卷积原理探究_第3张图片
Same:
卷积padding和反卷积原理探究_第4张图片
Full:
卷积padding和反卷积原理探究_第5张图片

2、反卷积

了解完卷积的相关知识,现在我们来了解一下反卷积的相关概念,或者说是转置卷积。反卷积是一种上采样技术, 用来升维还原作用, 比如抠图需要还原出原始图像大小的Mask。反卷积的计算过程和卷积差不多, 只不过它通过补零的方式扩大了原始图像然后再卷积, 最终结果是输出图片变大, 执行动画如下:

通俗来说,卷积层的前向卷积过程可以理解成为反卷积层的反向传播过程,卷积层的反向传播过程就是反卷
积层的前向传播过程;卷积层的前向反向过程分别是计算乘C和( C )t,而反卷积的前向反向计算分别成为(( C )t)t。

卷积padding和反卷积原理探究_第6张图片
卷积padding和反卷积原理探究_第7张图片

值得注意的是如同卷积网络需要padding,反卷积网络同样需要引入padding,否则伴随相同的卷积层参数,仍然有可能面临输出size不确定的问题。此时pytorch网络决定引入output_padding变量,最好的output_padding应该取stride-1,这样输入输出才能够成比例。那取别的值运算可以吗?可以,不会妨碍到这一个反卷积的计算,但是在网络的后面进行与尺寸有关的操作时就要注意了,此时的输出不是输入尺寸* stride了。

关于output_padding的总结:
stride就是输入的feature map膨胀的程度,可以看到stride=2,大约就是像素之间间隔1个元素,stride=3的时候则像素之间间隔两个元素。有一个有意思的事实是因为反卷积的上采样率并不受到kernal size的影响,因此在训练和推理过程的stride定义彼此之间是互不影响的,stride数值可以直接影响到最终的放大倍数。比如训练时设定的上采样倍数为2,但是推理时设定stride为4也不影响,模型仍然可以正常运行。

由于卷积核滑动过程中,边界情况的不确定,使得在运算步长大于1的反卷积时会出现多种合法输出尺寸,pytorch的反卷积层提供了output_padding供使用者选择输出,一般情况下我们希望输入输出尺寸以步长为比例,因此output_padding一般取stride-1,同时padding取 (kernel_size - 1)/2 。

你可能感兴趣的:(深度学习入门,深度学习,神经网络,pytorch)