一文搞懂 deconvolution、transposed convolution、sub-pixel or fractional convolution
一文搞懂 deconvolution、transposed convolution、sub-pixel or fractional convolution
目录
博客:blog.shinelee.me | 博客园 | CSDN
写在前面
开篇先上图,图为deconvolution在像素级语义分割中的一种应用,直观感觉deconvolution是一个upsampling的过程,像是convolution的对称过程。
本文将深入deconvolution的细节,并通过如下方式展开:
- 先回答 什么是deconvolution?为什么会有transposed convolutionon、subpixel or fractional convolution这样的名字?
- 再介绍 各种情形下 transposed convolution是如何进行的,并提供一种统一的计算方法。
什么是deconvolution
首先要明确的是,deconvolution并不是个好名字,因为它存在歧义:
- deconvolution最初被定义为“inverse of convolution”或者“inverse filter”或者“解卷积”,是指消除先前滤波作用的方法。比如,我们认为原始图像是清晰的,但是通过透镜观测到的图像却变得模糊,如果假设透镜的作用相当于以某个kernel作用在原始图像上,由此导致图像变得模糊,那么根据模糊的图像估计这个kernel或者根据模糊图像恢复原始清晰图像的过程就叫deconvolution。
- 后来论文Adaptive Deconvolutional Networks for Mid and High Level Feature Learning和Visualizing and Understanding Convolutional Networks又重新定义了deconvolution,实际上与transposed convolution、sub-pixel or fractional convolution指代相同。transposed convolution是一个更好的名字,sub-pixel or fractional convolution可以看成是transposed convolution的一个特例。对一个常规的卷积层而言,前向传播时是convolution,将input feature map映射为output feature map,反向传播时则是transposed convolution,根据output feature map的梯度计算出input feature map的梯度,梯度图的尺寸与feature map的尺寸相同。
本文谈论的是deconvolution的第2个含义,后面统一使用transposed convolution这个名字。
什么是transposed convolution?A guide to convolution arithmetic for deep learning中有这样一段话:
看完好像仍不是很直观,transposed convolution到底对应的是什么操作?等到文章的后面,这个问题的答案会逐渐清晰起来。
下面先以1个例子来对比convolution过程和transposed convolution过程,采用与A guide to convolution arithmetic for deep learning相同的设置:
- 2-D transposed convolutions (N=2N=2)
- square inputs (i1=i2=ii1=i2=i)
- square kernel size (k1=k2=kk1=k2=k)
- same strides along both axes (s1=s2=ss1=s2=s)
- same zero padding along both axes (p1=p2=pp1=p2=p)
- square outputs (o1=o2=oo1=o2=o)
若令i=4i=4、s=1s=1、p=0p=0、k=3k=3,输出尺寸o=2o=2,则convolution过程是将4×44×4的map映射为2×22×2的map,而transposed convolution过程则是将2×22×2的map映射为4×44×4的map,两者的kernel size均为3,如下图所示:
可以看到,convolution过程zero padding的数量与超参数pp一致,但是transposed convolution实际的zero padding的数量为2,为什么会这样?是为了保持连接方式相同,下面具体看一下。
convolution过程
先看convolution过程,连接方式 如下图所示,绿色表示输出,蓝色表示输入,每个绿色块具与9个蓝色块连接。
令卷积核w=⎛⎝⎜w0,0w1,0w2,0w0,1w1,2w2,1w0,2w1,2w2,2⎞⎠⎟w=(w0,0w0,1w0,2w1,0w1,2w1,2w2,0w2,1w2,2),为了便于理解,将卷积写成矩阵乘法形式,令xx为4×44×4输入矩阵以行优先方式拉成的长度为16的向量,yy为2×22×2输出矩阵以同样方式拉成的长度为4的向量,同时将ww表示成4×164×16的稀疏矩阵CC,