# 写在前面

• 先回答 什么是deconvolution？为什么会有transposed convolutiononsubpixel or fractional convolution这样的名字？
• 再介绍 各种情形下 transposed convolution是如何进行的，并提供一种统一的计算方法

# 什么是deconvolution

1. deconvolution最初被定义为“inverse of convolution”或者“inverse filter”或者“解卷积”，是指消除先前滤波作用的方法。比如，我们认为原始图像是清晰的，但是通过透镜观测到的图像却变得模糊，如果假设透镜的作用相当于以某个kernel作用在原始图像上，由此导致图像变得模糊，那么根据模糊的图像估计这个kernel或者根据模糊图像恢复原始清晰图像的过程就叫deconvolution
2. 后来论文Adaptive Deconvolutional Networks for Mid and High Level Feature LearningVisualizing 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的尺寸相同。

• 2-D transposed convolutions ( N = 2 N=2 )
• square inputs ( i 1 = i 2 = i i_1=i_2=i )
• square kernel size ( k 1 = k 2 = k k_1=k_2=k )
• same strides along both axes ( s 1 = s 2 = s s_1=s_2=s )
• same zero padding along both axes ( p 1 = p 2 = p p_1=p_2=p )
• square outputs ( o 1 = o 2 = o o_1=o_2=o )

## convolution过程

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 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 ) \mathbf{C} = \left(\begin{array}{cccccccccccccccc}{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} & {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}}\end{array}\right)

## transposed convolution过程

• 特征可视化训练阶段的反向传播中应用的transposed convolution，并不是作为一个真正的layer存在于网络中，其kernel与convolution共享（但要经过中心对称后再卷积，相当于上面的 $\mathbf{C} ^T$）。
• 图像分割生成模型decoder中使用的transposed convolution，是网络中真实的layer，其kernel经初始化后需要通过学习获得（所以卷积核也就无所谓中心对称不对称了）。
• 前向传播为convolution/transposed convolution，则反向传播为transposed convolution/convolution。

# transposed convolution的计算

o = ⌊ i + 2 p − k s ⌋ + 1 o=\left\lfloor \frac{i+2p-k}{s} \right\rfloor + 1

## 整除的情况

i = s o − s + k − 2 p = [ o + ( s − 1 ) ( o − 1 ) ] + ( k − 2 p − 1 ) i = so-s+k-2p = [o+(s-1)(o-1)]+(k-2p-1)

i = [ o + ( s − 1 ) ( o − 1 ) ] + [ ( k − 1 ) + ( k − 2 p − 1 ) ] − k 1 + 1 i = \frac{[o+(s-1)(o-1)] + [(k-1)+(k-2p-1)] - k}{1} + 1

i ′ = o + ( s − 1 ) ( o − 1 ) i'=o+(s-1)(o-1) 、$p’=\frac{(k-1)+(k-2p-1)}{2} = k-p-1 、 、 s’=1 、 、 k’=k$，即transposed convolution实际卷积时使用的超参数，可以这样理解：

• i ′ = o + ( s − 1 ) ( o − 1 ) i'=o+(s-1)(o-1) ：convolution的输出为 o × o o\times o ，每行每列都是 o o 个元素，有 o − 1 o-1 个间隔，transposed convolution时在每个间隔处插入 s − 1 s-1 个0，整体构成transposed convolution的input map；

• p ′ = ( k − 1 ) + ( k − 2 p − 1 ) 2 = k − p − 1 p'=\frac{(k-1)+(k-2p-1)}{2} = k-p-1 ：在上一步input map的基础上再进行padding，考虑convolution常用的几种padding情况：

• VALID p = 0 p=0 ，transposed convolution则需padding p ′ = k − 1 p'=k-1 ，即FULL padding
• SAME p = k − 1 2 = r p=\frac{k-1}{2}=r ，这里考虑 k = 2 r + 1 k=2r+1 为奇数的一般情况，此时 p ′ = r p'=r ，即SAME padding
• FULL p = k − 1 p=k-1 ，则 p ′ = 0 p'=0 ，即VALID padding

可见，convolution和transposed convolution的padding也具有某种对称性 p ′ + p = k − 1 p'+p=k-1

• k ′ = k k'=k ：transposed convolution的kernel size与convolution相同；

• s ′ = 1 s'=1 transposed convolution的stride均为1，但也可以换个角度理解，如果认为 o × o o\times o 相邻元素间的距离为1个像素，那么在间隔处插入 s − 1 s-1 个0后（ s > 1 s > 1 ），得到的input map相邻元素间的距离就是亚像素的（sub-pixel），所以此时也可以称之为 sub-pixel or fractional convolution

• o ′ = i = i ′ + 2 p ′ − k ′ s ′ + 1 o'=i=\frac{i'+2p'-k'}{s'}+1 ：transposed convolution的输出与convolution的输入具有相同尺寸。

## 不整除的情况

o ′ = i ′ + 2 p ′ − k ′ s ′ + 1 = i − a o'=\frac{i'+2p'-k'}{s'}+1=i-a

o ′ = i ′ + 2 p ′ + a − k ′ s ′ + 1 o'= \frac{i'+2p'+a-k'}{s'}+1

# 总结

• convolution和transposed convolution互为对称过程，存在一个convolution，就存在一个与之对应的transposed convolution，反之亦然；
• convolution是将input size的map映射为output size的map，transposed convolution是将output size的map映射为input size的map——旨在将尺寸恢复
• 两者均使用卷积操作，为了方便，两者使用同样的stride、padding、kernel size超参数，但实际执行时的操作不同，一般情况下，transposed convolution与convolution实际超参数关系为： i ′ = o + ( s − 1 ) ( o − 1 ) i'=o+(s-1)(o-1) 、$p’=\frac{(k-1)+(k-2p-1)}{2} = k-p-1 、 、 s’=1 、 、 k’=k$。
• 之所以做这样的操作，是为了保证map间的连接方式相同（权重不一定相同），权重的设置需根据应用的场景，可能通过学习得到，也可能与convolution共享（但需要中心对称后再使用）。

04-27
09-12 1572
01-05 3万+
08-20
12-18 41万+
02-15