反卷积 :反卷积也被称为 转置卷积
,反卷积其实就是卷积的逆过程。 大家可能对于反卷积的认识有一个误区,以为通过反卷积就可以获取到经过卷积之前的图片, 实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。
CLASS
torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode=‘zeros’, device=None, dtype=None)
stride:
控制互相关的步幅;
padding:
控制 dilation * (kernel_size - 1) - padding 点数两侧的隐式零填充量;
output_padding:
控制添加到输出形状一侧的附加大小;
dilation:
控制内核点之间的间距; 也称为 à trous 算法。
groups:
控制输入和输出之间的连接。 in_channels 和 out_channels 都必须能被组整除。 例如,
- 在 groups=1 时,所有输入都卷积到所有输出。
- 在 groups=2 时,该操作等效于并排有两个卷积层,每个卷积层看到一半的输入通道并产生一半的输出通道,并且随后将两者连接起来。
- 在 groups=in_channels 处,每个输入通道都与自己的一组过滤器进行卷积(大小为 out_channels in_channels \frac{\text{out\_channels}}{\text{in\_channels}} in_channelsout_channels)
I n p u t : ( N , C i n , H i n , W i n ) o r ( C i n , H i n , W i n ) Input:(N,C_{in},H_{in},W_{in}) or (C_{in},H_{in},W_{in}) Input:(N,Cin,Hin,Win)or(Cin,Hin,Win) O u t p u t : ( N , C o u t , H o u t , W o u t ) o r ( C o u t , H o u t , W o u t ) Output:(N,C_{out},H_{out},W_{out}) or (C_{out},H_{out},W_{out}) Output:(N,Cout,Hout,Wout)or(Cout,Hout,Wout)
H o u t = ( H i n − 1 ) × s t r i d e [ 0 ] − 2 × p a d d i n g [ 0 ] + d i l a t i o n [ 0 ] × ( kernel_size[0] − 1 ) + output_padding[0] + 1 H_{out} =(H_{in} −1)×stride[0]−2×padding[0]+dilation[0]×(\text{kernel\_size[0]}−1)+\text{output\_padding[0]}+1 Hout=(Hin−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
W o u t = ( W i n − 1 ) × s t r i d e [ 0 ] − 2 × p a d d i n g [ 0 ] + d i l a t i o n [ 0 ] × ( kernel_size[0] − 1 ) + output_padding[0] + 1 W_{out} =(W_{in} −1)×stride[0]−2×padding[0]+dilation[0]×(\text{kernel\_size[0]}−1)+\text{output\_padding[0]}+1 Wout=(Win−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
import torch
import torch.nn as nn
m = nn.ConvTranspose2d(16, 33, 3, stride=2)
input = torch.randn(20, 16, 50, 100)
output = m(input)
print(output.shape)
torch.Size([20, 33, 101, 201])