在深度学习中的计算机视觉领域,由于使用卷积层对图像提取特征以后,输出图像的尺寸往往会变小,而有时我们需要得到一个和原来图像尺寸相同的输出结果以便进行下一步的计算。这个扩大图像尺寸,实现图像由小分辨率到大分辨率映射的操作,叫做上采样。
上采样有很多种方法可以实现,最常见的3种有:双线性插值(bilinear)、反卷积(deconvolution)和反池化(unpooling)。这里的反卷积就是我们重点讨论的操作,它也可以叫做转置卷积。
反卷积并不是正向卷积的逆过程,它只是针对图像尺寸而言:正向卷积一般情况下会让图像的尺寸由大变小,而反卷积则相反,会让图像尺寸由小变大,即和原图像相同的尺寸。
假设输入图像 i n p u t input input尺寸为 4 × 4 4\times 4 4×4,元素矩阵为:
[ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x 15 x 16 ] \begin{bmatrix} x_1 & x_2 & x_3 & x_4 \\ x_5 & x_6 & x_7 & x_8 \\ x_9 & x_{10} & x_{11} & x_{12} \\ x_{13} & x_{14} & x_{15} & x_{16} \\ \end{bmatrix} ⎣⎢⎢⎡x1x5x9x13x2x6x10x14x3x7x11x15x4x8x12x16⎦⎥⎥⎤
卷积核 k e r n e l kernel kernel尺寸为 3 × 3 3\times 3 3×3,元素矩阵为:
[ w 0 , 0 w 0 , 1 w 0 , 2 w 1 , 0 w 1 , 1 w 1 , 2 w 2 , 0 w 2 , 1 w 2 , 2 ] \begin{bmatrix} w_{0,0} & w_{0,1} & w_{0,2}\\ w_{1,0} & w_{1,1} & w_{1,2}\\ w_{2,0} & w_{2,1} & w_{2,2}\\ \end{bmatrix} ⎣⎡w0,0w1,0w2,0w0,1w1,1w2,1w0,2w1,2w2,2⎦⎤
设步长 s t r i d e s = 1 strides=1 strides=1,填充 p a d d i n g = 0 padding=0 padding=0,即 i = 4 , k = 3 , s = 1 , p = 0 i=4,k=3,s=1,p=0 i=4,k=3,s=1,p=0,卷积后的图像边长为 0 = i + 2 p − k s + 1 = 2 0=\frac{i+2p-k}{s}+1=2 0=si+2p−k+1=2,即输出图像 o u t p u t output output的尺寸为 2 × 2 2\times 2 2×2.
用列向量 X X X表示输入图像 i n p u t input input,即:
i n p u t = [ x 1 x 2 x 3 ⋯ x 16 ] T input=[x_1\quad x_2\quad x_3 \cdots x_{16}]^T input=[x1x2x3⋯x16]T
用列向量 Y Y Y表示输出图像 o u t p u t output output,即:
o u t p u t = [ y 1 y 2 y 3 y 4 ] T output=[y_1\quad y_2\quad y_3\quad y_4]^T output=[y1y2y3y4]T
卷积过程可以向量化为:
Y = C X Y=CX Y=CX
其中,矩阵 C C C是 4 × 16 4\times 16 4×16维,经过推到,可以得到 C C C是一个稀疏矩阵:
C = [ w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 0 0 0 0 0 0 w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 0 0 0 0 0 0 0 0 0 w 0 , 0 w 0 , 1 w 0 , 2 0 w 1 , 0 w 1 , 1 w 1 , 2 0 w 2 , 0 w 2 , 1 w 2 , 2 ] C=\begin{bmatrix} w_{0,0} & w_{0,1} & w_{0,2} &0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,2}&0&0&0&0&0\\ 0&w_{0,0}&w_{0,1}&w_{0,2}&0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,2}&0&0&0&0\\ 0&0&0&0&0&w_{0,0}&w_{0,1}&w_{0,2}&0&w_{1,0}&w_{1,1}&w_{1,2}&0&w_{2,0}&w_{2,1}&w_{2,2} \end{bmatrix} C=⎣⎡w0,000w0,1w0,00w0,2w0,100w0,20w1,000w1,1w1,0w0,0w1,2w1,1w0,10w1,2w0,2w2,000w2,1w2,0w1,0w2,2w2,1w1,10w2,2w1,200000w2,000w2,100w2,2⎦⎤
反卷积就是通过 Y , C Y,C Y,C得到 X X X,直观的就会想到下面的式子:
X = C − 1 Y X=C^{-1}Y X=C−1Y
但是按照数学的定义来讲:矩阵 C − 1 C^{-1} C−1不一定存在。这里注意一点是深度学习的很多操作并不是很严密的数学推理,只是直观感受。这里同样体现了这一点:我们想得到 X X X,实际上只是想要得到一个和 X X X维度相同的矩阵,即 16 × 1 16\times 1 16×1,已知的 Y Y Y也是指和正向卷积的输出尺寸相同的矩阵,即 4 × 1 4\times1 4×1,矩阵具体元素是否相等我们并不要求。因此,对于矩阵 C C C而言,我们不需要对它求逆,
仅就维度而言,根据矩阵乘法原理, C − 1 C^{-1} C−1的维度是 16 × 4 16\times 4 16×4,而 C C C的维度是 4 × 16 4\times 16 4×16,二者互为转置,因此我们把公式里的 C − 1 C^{-1} C−1写为 C T C^T CT,即:
X = C T Y X=C^{T}Y X=CTY
上式就是反卷积的向量化表示,因此反卷积也叫做转置卷积。从上面的描述中可以知道,反卷积只能恢复 X X X的尺寸,不能恢复 X X X的每个元素值。
反卷积是卷积的一种, C T C^{T} CT的值可以通过网络学习得到。
符号假设:
o = s i z e o f o u t p u t i = s i z e o f i n p u t p = p a d d i n g s = s t r i d e s } \left. \begin{array}{l} & o=size of output\\ & i=size of input\\ & p=padding\\ & s=strides\\ \end{array} \right\} o=sizeofoutputi=sizeofinputp=paddings=strides⎭⎪⎪⎬⎪⎪⎫
此时反卷积的输入输出尺寸关系为:
o = s ( i − 1 ) − 2 p + k o=s(i-1)-2p+k o=s(i−1)−2p+k
此时反卷积的输入输出尺寸关系为:
o = s ( i − 1 ) − 2 p + k + ( o + 2 p − k ) % s o=s(i-1)-2p+k+(o+2p-k)\%s o=s(i−1)−2p+k+(o+2p−k)%s
当 s t r i d e s strides strides和 k e r n e l s i z e kernel\quad size kernelsize不能整除时,会出现混叠现象,导致反卷积生成的图像会有混叠现象,二维图像的棋盘格现象更明显。因此在反卷积时需要注意参数的配置,或者直接换用上采样 + + +卷积的方法。
提供一个全面解析棋盘格现象的链接:反卷积棋盘格深度解析