
def trans_conv(X, K):h, w = K.shapeY = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))for i in range(X.shape[0]):for j in range(X.shape[1]):Y[i: i + h, j: j + w] += X[i, j] * Kreturn Y
X = torch.tensor([[0.0, 1.0], [2.0, 3.0]])K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])trans_conv(X, K)
tensor([[ 0., 0., 1.],[ 0., 4., 6.],[ 4., 12., 9.]])
或者,当输入X和卷积核K都是四维张量时,我们可以使用高级API获得相同的结果。
批量大小和通道数都为1
X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 2, 2)tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)tconv.weight.data = Ktconv(X)
tensor([[[[ 0., 0., 1.],[ 0., 4., 6.],[ 4., 12., 9.]]]], grad_fn=<SlowConvTranspose2DBackward>)
13.10.2. 填充、步幅和多通道
tconv = nn.ConvTranspose2d(1, 1, kernel_size=2, padding=1, bias=False)tconv.weight.data = Ktconv(X)
tensor([[[[4.]]]], grad_fn=<SlowConvTranspose2DBackward>)
