转置卷积个人理解(以pytorch为例)

本文参考:

https://www.zhihu.com/question/43609045

https://blog.csdn.net/isMarvellous/article/details/80087705

 

转置卷积又称反卷积

       直观理解就是卷积的反向操作,比如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-k+2*p)/s+1=y

 

反卷积:x=(y-1)*s-2*p+k

此时x就作为反卷积的输出,在pytorch上有个output_padding参数,故输出大小为x=(y-1)*s-2*p+k后再加个output_padding

 

反卷积的实现原理实际就是卷积,但为了输出大小反而变大,就在输入图片中添加了padding

转置卷积个人理解(以pytorch为例)_第1张图片

这个添加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])

转置卷积个人理解(以pytorch为例)_第2张图片

为啥又叫转置卷积呢?

这是因为转置卷积在实际计算过程中相比直接卷积将权重矩阵转置了再左乘输入

这里参考知乎上的回答https://www.zhihu.com/question/43609045/answer/120266511

你可能感兴趣的:(深度学习)