Is F.conv_transpose2d transpose of F.conv2d?

For an input image x and a convolution layer w, output y = w(x)
Let’s say we expand x as a giant column vector X and w as a giant matrix W so that Y=WX.
Now we want to compute W^T(WX). Should we use F.conv_transpose2d or F.conv2d with tranposed weight matrix? These two operations give different values since the second assertion fails.

import torch
from torch import nn
import torch.nn.functional as F

i = torch.randn(16, 3, 32, 32)
w = torch.randn(3, 32, 5, 5)
o1 = F.conv2d(i, w.transpose(1, 0), padding=2)
o2 = F.conv_transpose2d(i, w, padding=2)

assert o1.shape == o2.shape, "shape doesn't match!"
assert torch.all((o1 - o2) < 1e-3), "value doesn't equal!"

I found when the conv is 1*1 and padding=0 the second assertion passes. But using larger kernel and setting padding=(kernel_size-1)/2 to keep shape will cause failure. How to solve this problem?


The transpose convolution is the common name for the inverse of the convolution. So if you use the correct parameters for stride and padding, you should have W^T(WX) = X.