ConvTranspose2d 实现的是 Conv2d 的逆过程,也就是将一张 m × m m \times m m×m 的图片,upsampling 到 n × n n \times n n×n,这里 n > m n > m n>m。 ConvTranspose2d 的实现方法,与 Assignment 2 | ConvolutionalNetworks 计算 dx 的方法完全相同。实际上,不论在 PyTorch 还是在 TensorFlow 里面,ConvTranspose2d 的实现和计算 dx 的梯度的实现,使用的是同一段代码。在 PyTorch 的文档里明确说明了这一点:
This module can be seen as the gradient of Conv2d with respect to its input.
这里先把 Conv2d 中计算 dx 的方法写一下:
dx 的计算方法
这里写出 dx 和 dw 的闭式解很复杂,而且不容易写出代码,所以这里用一个例子来推出 dx 和 dw 的计算过程,根据此计算过程可以将代码写出。这里 stride = 1,pad = 0,x,w,y为:
x = [ x 11 x 12 x 13 x 21 x 22 x 23 x 31 x 32 x 33 ] , w = [ w 11 w 12 w 21 w 22 ] , y = [ y 11 y 12 y 21 y 22 ] x = \begin{bmatrix} x_{11}& x_{12}& x_{13}\newline x_{21}& x_{22}& x_{23}\newline x_{31}& x_{32}& x_{33} \end{bmatrix}, \quad w = \begin{bmatrix} w_{11}& w_{12}\newline w_{21}& w_{22} \end{bmatrix}, \quad y = \begin{bmatrix} y_{11}& y_{12}\newline y_{21}& y_{22} \end{bmatrix} x=[x11x12x13x21x22x23x31x32x33],w=[w11w12w21w22],y=[y11y12y21y22]
将 y = x × w y = x \times w y=x×w 展开:
y 11 = w 11 x 11 + w 12 x 12 + w 21 x 21 + w 22 x 22 y 12 = w 11 x 12 + w 12 x 13 + w 21 x 22 + w 22 x 23 y 21 = w 11 x 21 + w 12 x 22 + w 21 x 31 + w 22 x 32 y 22 = w 11 x 22 + w 12 x 23 + w 21 x 32 + w 22 x 33 \begin{aligned} y_{11} &= w_{11}x_{11} + w_{12}x_{12} + w_{21}x_{21} + w_{22}x_{22} \newline y_{12} &= w_{11}x_{12} + w_{12}x_{13} + w_{21}x_{22} + w_{22}x_{23} \newline y_{21} &= w_{11}x_{21} + w_{12}x_{22} + w_{21}x_{31} + w_{22}x_{32} \newline y_{22} &= w_{11}x_{22} + w_{12}x_{23} + w_{21}x_{32} + w_{22}x_{33} \newline \end{aligned} y11=w11x11+w12x