image.png

  1. def trans_conv(X, K):
  2. h, w = K.shape
  3. Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
  4. for i in range(X.shape[0]):
  5. for j in range(X.shape[1]):
  6. Y[i: i + h, j: j + w] += X[i, j] * K
  7. return Y
  1. X = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
  2. K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
  3. trans_conv(X, K)
  1. tensor([[ 0., 0., 1.],
  2. [ 0., 4., 6.],
  3. [ 4., 12., 9.]])

或者,当输入X和卷积核K都是四维张量时,我们可以使用高级API获得相同的结果。
批量大小和通道数都为1

  1. X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)
  2. tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)
  3. tconv.weight.data = K
  4. tconv(X)
  1. tensor([[[[ 0., 0., 1.],
  2. [ 0., 4., 6.],
  3. [ 4., 12., 9.]]]], grad_fn=<SlowConvTranspose2DBackward>)

13.10.2. 填充、步幅和多通道

  1. tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, padding=1, bias=False)
  2. tconv.weight.data = K
  3. tconv(X)
  1. tensor([[[[4.]]]], grad_fn=<SlowConvTranspose2DBackward>)