反卷积 :反卷积也被称为 转置卷积
,反卷积其实就是卷积的逆过程。 大家可能对于反卷积的认识有一个误区,以为通过反卷积就可以获取到经过卷积之前的图片, 实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。
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])