首先,先上结论,Transpose Convolution 可以看成是在原始input的基础上做padding之后的常规Convolution. 所以常规的Convolution的计算性质也适用于Transpose Convolution.
需要特别注意的是,Trans Conv中的stride和常规Conv的stride有点不太一样的是,常规Conv的stride是对kernel的移动步长,而Trans Conv的stride是对输入input元素间的间隔。常规的Conv 以及其对应的Trans Conv的具体过程请看下面两幅图
用 i 代表input , k 代表kernel,s代表stride,p代表padding
Stride为1时
常规的 Conv , i = 4x4 , k = 3x3 , s = 1, p = 0
Trans Conv , i=2x2 , k = 3x3 , s = 1 , p = 2
图中灰色代表kernel,蓝色是input,绿色是output
上图中可以看出,在Trans Conv过程中,原始的2x2的input被padding成了6x6,再进行常规的Conv,而kernel保持不变(3x3),从而使得经过Trans Conv后,2x2的“input”被恢复成了5x5的"output"
Stride > 1时
常规的Conv ,i = 5x5 ,k = 3x3 ,s = 2,p = 0
Trans Conv ,i = 2x2,k= 3x3,s = 2,p = 2
与之前stride=1的图不一样的是,stide>1时,Trans Conv中的input的元素间会充填 stride-1行(列)0(类似Dilated Convolution中的膨胀因子d的作用)而kernel滑动的步长仍然保持不变 (Trans Conv 的滑动步长始终等于 1),这与常规Conv中stride的作用有着本质的区别。
计算公式
常规Conv
H o u t = ⌊ H i n + 2 × p − k s + 1 ⌋ H_{out} =\left\lfloor\frac{H_{in} + 2 \times \text{p} - \text{k} }{\text{s}} + 1\right\rfloor Hout=⌊sHin+2×p−k+1⌋
Trans Conv
H o u t = H i n + ( H i n − 1 ) ( s − 1 ) + 2 ( k − p ′ − 1 ) − k + 1 H_{out} = H_{in} + (H_{in} - 1 )(s- 1) + 2(k - p'- 1) - k+ 1 Hout=Hin+(Hin−1)(s−1)+2(k−p′−1)−k+1
注:p’ 为转置卷积充填的padding大小, k 为卷积核大小,p 为设置的padding大小, 其中 p ′ = k − p − 1 p' = k - p - 1 p′=k−p−1 最终化简得到如下表达式:
H o u t = ( H i n − 1 ) × s − 2 p ′ + k H_{out} = (H_{in} - 1) \times s - 2 p' + k Hout=(Hin−1)×s−2p′+k
注: 这里的 p’ 实际上控制着输出图像的大小,从公式 p ′ = k − p − 1 p' = k - p - 1 p′=k−p−1 可以看出,如果设定的padding 大小p 刚好满足 p = k - 1 的话,那么卷积核刚好覆盖了padding区域和有实际值的区域,输出的图像大小就不需要减去p’,即此时p’ = 0。否则,当设定的padding大小p 小于 k - 1,此时卷积核区域超出了有实际值的区域和padding区域,利用了一些隐式设定的值来满足计算要求,那么最后输出的图像外围就包含了一些不该存在的值,由于p < k - 1 此时,p’ >0 ,所以输出图像需要减去2p’ 来消除上述影响。