目录
1 卷积层
Pytorch中2D卷积层的接口为:
class torch.nn.Conv2d(in_channnels, out_channels, kernal_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zero')
假设输入的特征图的尺寸为
(
b
a
t
c
h
,
H
i
n
,
W
i
n
,
i
n
c
h
a
n
n
e
l
s
)
(batch, H_{in}, W_{in}, in_channels)
(batch,Hin,Win,inchannels),则输出的特征图的尺寸
(
b
a
t
c
h
,
H
o
u
t
,
W
o
u
t
,
o
u
t
c
h
a
n
n
e
l
s
)
(batch, H_{out}, W_{out}, out_channels)
(batch,Hout,Wout,outchannels)可根据下列公式计算:
H
o
u
t
=
⌊
H
i
n
−
k
e
r
n
a
l
_
s
i
z
e
[
0
]
+
2
×
p
a
d
d
i
n
g
[
0
]
s
t
r
i
d
e
[
0
]
+
1
⌋
(1)
H_{out}=\lfloor\frac{H_{in}-kernal\_size[0]+2\times padding[0]}{stride[0]}+1\rfloor\tag{1}
Hout=⌊stride[0]Hin−kernal_size[0]+2×padding[0]+1⌋(1)
W
o
u
t
=
⌊
W
i
n
−
k
e
r
n
a
l
_
s
i
z
e
[
1
]
+
2
×
p
a
d
d
i
n
g
[
1
]
s
t
r
i
d
e
[
1
]
+
1
⌋
(2)
W_{out}=\lfloor\frac{W_{in}-kernal\_size[1]+2\times padding[1]}{stride[1]}+1\rfloor\tag{2}
Wout=⌊stride[1]Win−kernal_size[1]+2×padding[1]+1⌋(2)
注意:上述公式是在没有考虑空洞卷积(Dilated/Atrous Convolution)的情况下的计算方式
1.1 空洞卷积
在dilation参数不为1的情况下,也即卷积过程中点与点的距离不为1的情况下,计算公式变为:
H
o
u
t
=
⌊
H
i
n
−
d
i
l
a
t
i
o
n
[
0
]
×
(
k
e
r
n
a
l
_
s
i
z
e
[
0
]
−
1
)
−
1
+
2
×
p
a
d
d
i
n
g
[
0
]
s
t
r
i
d
e
[
0
]
+
1
⌋
(3)
H_{out}=\lfloor\frac{H_{in}-dilation[0]\times (kernal\_size[0]-1)-1+2\times padding[0]}{stride[0]}+1\rfloor\tag{3}
Hout=⌊stride[0]Hin−dilation[0]×(kernal_size[0]−1)−1+2×padding[0]+1⌋(3)
W
o
u
t
=
⌊
W
i
n
−
d
i
l
a
t
i
o
n
[
1
]
×
(
k
e
r
n
a
l
_
s
i
z
e
[
1
]
−
1
)
−
1
+
2
×
p
a
d
d
i
n
g
[
1
]
s
t
r
i
d
e
[
1
]
+
1
⌋
(4)
W_{out}=\lfloor\frac{W_{in}-dilation[1]\times (kernal\_size[1]-1)-1+2\times padding[1]}{stride[1]}+1\rfloor\tag{4}
Wout=⌊stride[1]Win−dilation[1]×(kernal_size[1]−1)−1+2×padding[1]+1⌋(4)
注意,公式中 d i l a t i o n [ 0 ] × ( k e r n a l _ s i z e [ 0 ] − 1 ) + 1 dilation[0]\times (kernal\_size[0]-1)+1 dilation[0]×(kernal_size[0]−1)+1用来计算空洞化后卷积核的大小。
2 感受野(receptive field)
在卷积神经网络中,感受野(receptive field)的定义是:
卷积神经网络每一层输出的特征图上的像素点在原始图像上映射的区域大小。
感受野的计算公式如下:
l
k
=
l
k
−
1
+
[
(
f
k
−
1
)
∗
∏
i
=
1
k
−
1
s
i
]
(5)
l_k=l_{k-1}+[(f_k-1)*\prod_{i=1}^{k-1}s_i]\tag{5}
lk=lk−1+[(fk−1)∗i=1∏k−1si](5)
其中,
l
k
−
1
l_{k-1}
lk−1为第
k
−
1
k-1
k−1层对应的感受野大小,
f
k
f_k
fk为第
k
k
k层的卷积核大小,或者是池化层的池化尺寸大小,
s
i
s_i
si是第
i
i
i层的卷积或池化步长。
3 转置卷积
转置卷积(Transposed convolution)又称为反卷积(Deconvolution)或分数步长卷积(Fractionally-strided convolution),是用来增大特征图尺寸(上采样up-sampling)的一种手段。卷积和转置卷积在底层计算时都涉及一个概念------卷积矩阵。更详细内容请了解:转置卷积。
4 批量归一化
批量归一化(Batch Normalization)是为了应对深度模型训练的挑战。在模型训练时,批量归一化利用小批量上的均值和标准差,不断调整神经网络的中间输出,从而使整个神经网络在各层的中间输出的数值更稳定。
4.1 为什么需要批量归一化
浅层神经网络,数据标准预处理就足够有效了,随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化;
但对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层的输出出现剧烈变化。这种计算数值的不稳定性通常令我们难以训练出有效的深度模型。
4.2 怎么进行批量归一化
4.2.1 全连接层的BN
4.2.2 卷积层的BN
对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数,并均为标量。设小批量中有 m m m个样本。在单个通道上,假设卷积计算输出的高和宽分别为 p p p和 q q q。我们需要对该通道中 m × p × q m\times p\times q m×p×q个元素同时做批量归一化。对这些元素做标准化计算时,我们使用相同的均值和方差,即该通道中 m × p × q m\times p\times q m×p×q个元素的均值和方差。
4.2.3 预测时的BN
在实际测试的过程中,BN算法的参数就已经固定好了,首先进行归一化时的平均值为:
E
(
x
)
=
E
B
[
μ
B
]
E(x)=E_B[\mu_B]
E(x)=EB[μB]
即为算有mini-batch的平均值的平均值,而方差为:
V
a
r
[
x
]
=
m
m
−
1
⋅
E
B
[
σ
B
2
]
Var[x]=\frac{m}{m-1}\cdot E_B[\sigma_B^2]
Var[x]=m−1m⋅EB[σB2]
即每个批次的方差的无偏估计。