直观理解就是卷积的反向操作,比如4*4的图片用3*3的卷积核卷积,s=1,p=0,得到2*2的大小图片,反卷积就是要使输入2*2的输出为4*4的。
在pytorch使用
class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)
注意,这上面的stride、padding是争对于与原始卷积上的stride和padding
比如
from torch import nn
import torch
upsample=nn.ConvTranspose2d(3,3,kernel_size=3,stride=
1,padding=0)
in_=torch.randn(1,3,2,2)
out_=upsample(in_)
print(out_.size())
输出:torch.Size([1, 3, 4, 4])
原始卷积公式(x为输入大小,y为输出大小):
反卷积:
此时x就作为反卷积的输出,在pytorch上有个output_padding参数,故输出大小为后再加个output_padding
反卷积的实现原理实际就是卷积,但为了输出大小反而变大,就在输入图片中添加了padding
这个添加padding要注意要保持原始卷积像素之间的连接关系,例如,直接卷积的输入的左上像素仅对输出的左上像素有贡献,右上像素仅连接到右上输出像素,等等。这个可参考https://blog.csdn.net/isMarvellous/article/details/80087705理解
对于stride大于一的也一样,不过还要在像素之间添加padding,使其满足上述要求
from torch import nn
import torch
upsample=nn.ConvTranspose2d(3,3,kernel_size=3,stride=
2,padding=0)
in_=torch.randn(1,3,2,2)
out_=upsample(in_)
print(out_.size())
输出torch.Size([1, 3, 5, 5])
这是因为转置卷积在实际计算过程中相比直接卷积将权重矩阵转置了再左乘输入
这里参考知乎上的回答https://www.zhihu.com/question/43609045/answer/120266511