con2d
是pytorch
中最经常使用的卷积函数之一,那么有必要对其语法和使用时需要注意的一些细节有所了解。
以下内容均参考自 pytroch conv2d官网
Conv2d
函数原型
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
函数的作用是对输入的多通道输入信号做二维卷积,假设输入的信息大小为
(
N
,
C
i
n
,
H
,
W
)
({N}, C_in, H, W)
(N,Cin,H,W),容易知道在图像处理中N
代表每一批输入的图片数量,C_in
表示的是每张图像的通道数,H,W
则代表图片的高和宽,这是表示多张图片最常用的表示形式。
卷积运算数学表达形式如下:
out
(
N
i
,
C
o
u
t
j
)
=
bias
(
C
o
u
t
j
)
+
∑
k
=
0
C
i
n
−
1
weight
(
C
o
u
t
j
,
k
)
⋆
input
(
N
i
,
k
)
\operatorname{out}\left(N_{i}, C_{\mathrm{out}_{j}}\right)=\operatorname{bias}\left(C_{\mathrm{out}_{j}}\right)+\sum_{k=0}^{C_{\mathrm{in}}-1} \text { weight }\left(C_{\mathrm{out}_{j}}, k\right) \star \operatorname{input}\left(N_{i}, k\right)
out(Ni,Coutj)=bias(Coutj)+k=0∑Cin−1 weight (Coutj,k)⋆input(Ni,k)
参数介绍
in_channels
: 进行卷积运算的输入的通道数
out_channels
:卷积运算后输出的通道数
kernel_size
:卷积核的大小,常见的有1 * 1, 3 * 3
stride
: 卷积运算步长
padding
:在输入的边缘进行的一定数量的填充,一般填充0
,目的是为了更加充分的利用输入的边界部分信息。
dilation
:在卷积核每个参数之间的空格,官网上给出了一个易于理解的动态演示
group
:对输入的通道进行分组卷积,得到多组结果,之后进行拼接,每组得到的通道数为
⌊
out_channels
in_channels
⌋
\left\lfloor\frac{\text { out\_channels} } {\text { in\_channels}}\right\rfloor
⌊ in_channels out_channels⌋,,默认为1
bias
:偏置,添加在卷积运算结果后面的可学习参数,形状为(out_channels, )
,默认为True
padding_mode
:默认为'zeros'
,注意是字符串。
输入与输出形状和卷积运算参数之间的关系
input shape
:(N, C_in, H_in, W_in)
output shape
: (N, C_out, H_out, W_out)
则有:
H o u t = ⌊ H i n + 2 × padding [ 0 ] − dilation[0] × ( kernel_size [ 0 ] − 1 ) − 1 stride[0] + 1 ⌋ H_out = \lfloor{\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation[0]} \times (\text{kernel\_size}[0] - 1) - 1} {\text{stride[0]}} + 1}\rfloor Hout=⌊stride[0]Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1+1⌋
W o u t = ⌊ H i n + 2 × padding [ 1 ] − dilation[1] × ( kernel_size [ 1 ] − 1 ) − 1 stride[1] + 1 ⌋ W_out = \lfloor{\frac{H_{in} + 2 \times \text{padding}[1] - \text{dilation[1]} \times (\text{kernel\_size}[1] - 1) - 1} {\text{stride[1]}} + 1}\rfloor Wout=⌊stride[1]Hin+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1+1⌋
注意这里的 ⌊ . . . ⌋ \lfloor...\rfloor ⌊...⌋是向下取整运算。