1. 函数语法格式
torch.nn.Conv2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros',
device=None,
dtype=None
)
2. 参数解释
- in_channels:输入的通道数,RGB 图像的输入通道数为 3
- out_channels:输出的通道数
- kernel_size:卷积核的大小,一般我们会使用 5x5、3x3 这种左右两个数相同的卷积核,因此这种情况只需要写 kernel_size = 5这样的就行了。如果左右两个数不同,比如3x5的卷积核,那么写作kernel_size = (3, 5),注意需要写一个 tuple,而不能写一个 list。
- stride = 1:卷积核在图像窗口上每次平移的间隔,即所谓的步长。
- padding:指图像填充,后面的int型常数代表填充的多少(行数、列数),默认为0。需要注意的是这里的填充包括图像的上下左右,以padding=1为例,若原始图像大小为[32, 32],那么padding后的图像大小就变成了[34, 34]
- dilation:是否采用空洞卷积,默认为1(不采用)。从中文上来讲,这个参数的意义从卷积核上的一个参数到另一个参数需要走过的距离,那当然默认是1了,毕竟不可能两个不同的参数占同一个地方吧(为0)。更形象和直观的图示可以观察Github上的Dilated convolution animations,展示了dilation=2的情况。
- groups:决定了是否采用分组卷积,groups参数可以参考groups参数详解
- bias:即是否要添加偏置参数作为可学习参数的一个,默认为True。
- padding_mode:即padding的模式,默认采用零填充。
3. 尺寸关系
在这段函数中,输入为
(
N
,
C
i
n
,
H
,
W
)
(N,C_{in},H,W)
(N,Cin,H,W),输出为
(
N
,
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
(N,C_{out},H_{out},W_{out})
(N,Cout,Hout,Wout),它们的关系为:
out
(
N
i
,
C
out
j
)
=
bias
(
C
out
j
)
+
∑
k
=
0
C
i
n
−
1
weight
(
C
out
j
,
k
)
⋆
input
(
N
i
,
k
)
\operatorname{out}\left(N_i, C_{\text {out }_j}\right)=\operatorname{bias}\left(C_{\text {out }_j}\right)+\sum_{k=0}^{C_{\mathrm{in}}-1} \operatorname{weight}\left(C_{\text {out }_j}, k\right) \star \operatorname{input}\left(N_i, k\right)
out(Ni,Cout j)=bias(Cout j)+k=0∑Cin−1weight(Cout j,k)⋆input(Ni,k)
其中 N 为 batch size,C 为输入通道数,H 为图像高,W 为图像宽。
输入可以为:
(
N
,
C
i
n
,
H
i
n
,
W
i
n
)
(N,C_{in},H_{in},W_{in})
(N,Cin,Hin,Win) 或
(
C
i
n
,
H
i
n
,
W
i
n
)
(C_{in},H_{in},W_{in})
(Cin,Hin,Win)
输出可以为:
(
N
,
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
(N,C_{out},H_{out},W_{out})
(N,Cout,Hout,Wout) 或
(
C
o
u
t
,
H
o
u
t
,
W
o
u
t
)
(C_{out},H_{out},W_{out})
(Cout,Hout,Wout)
它们之间的关系为:
H
o
u
t
=
⌊
H
i
n
+
2
×
p
a
d
d
i
n
g
[
0
]
−
d
i
l
a
t
i
o
n
[
0
]
×
(
k
e
r
n
e
l
_
s
i
z
e
[
0
]
−
1
)
−
1
s
t
r
i
d
e
[
0
]
+
1
⌋
H_{out}=\left\lfloor\frac{H_{in}+2 \times padding[0]-dilation[0] \times(kernel\_size[0]-1)-1}{ stride [0]}+1\right\rfloor
Hout=⌊stride[0]Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1+1⌋
W o u t = ⌊ W i n + 2 × p a d d i n g [ 1 ] − d i l a t i o n [ 1 ] × ( k e r n e l _ s i z e [ 1 ] − 1 ) − 1 s t r i d e [ 1 ] + 1 ⌋ W_{out}=\left\lfloor\frac{W_{in}+2 \times padding[1]-dilation[1] \times(kernel\_size[1]-1)-1}{ stride [1]}+1\right\rfloor Wout=⌊stride[1]Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1+1⌋
4. 使用案例
# With square kernels and equal stride
m = nn.Conv2d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
# non-square kernels and unequal stride and with padding and dilation
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
input = torch.randn(20, 16, 50, 100)
output = m(input)
5. nn.functional.conv2d
⭐ 区别
torch.nn.Conv2d
和 torch.nn.functional.conv2d
,在 pytorch 构建模型中,都可以作为二维卷积的引入,但前者为类模块,后者为函数,在使用上存在不同。
⭐ 使用
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)