《merge卷积和bn层的原理》
这是一个在移动端非常实用的技巧,而且丝毫不会影响模型的精度,而提高模型的运算速度,就是把BN层离线的时候做好,放在权重值和偏执项中就可以了。
Key Words:merge卷积层和BN层
Beijing, 2020
作者:RaySue
为了让部署的caffe模型获得更高的推理效率,一个技巧就是合并卷积层和BN层,通过离线的对网络的权重值进行计算,来一定程度的减少计算量。
BN层的融合即为将caffe中BN层与Scale层融合进Convolution的权重之中,把三层减少为一层,适用于训练完成的模型部署阶段,而不能用在训练中。
假设每一层的输入均表示为X,权重为W,则卷积层可以写作
X
o
u
t
=
W
X
i
n
+
b
(
1
)
X_{out} = WX_{in}+b \space\space\space\space\space\space\space\space\space\space\space\space (1)
Xout=WXin+b (1)
BN层操作,一个是归一化(caffe的BatchNorm),另一个是平移和缩放(caffe的Scale)其中caffe的BatchNorm操作为:
X
n
o
r
m
=
X
o
u
t
−
m
e
a
n
v
a
r
(
2
)
X_{norm} = \frac{X_{out}−mean}{\sqrt{var}} \space\space\space\space\space\space\space\space\space\space\space(2)
Xnorm=varXout−mean (2)
caffe的BN层之后的Scale的操作是平移和缩放, 其中
α
\alpha
α和
β
\beta
β是通过迭代学习的:
X
b
n
=
γ
×
X
n
o
r
m
+
β
(
3
)
X_{bn} = \gamma \times X_{norm}+\beta \space\space\space\space\space\space\space\space\space\space\space\space (3)
Xbn=γ×Xnorm+β (3)
合并上述(1)、(2)、(3)式,即可得到:
X
b
n
=
γ
×
(
W
X
i
n
+
b
)
−
m
e
a
n
v
a
r
+
β
(
4
)
X_{bn} = \gamma \times \frac {(WX_{in}+b) - mean} {\sqrt{var}} + \beta \space\space\space (4)
Xbn=γ×var(WXin+b)−mean+β (4)
展开(4):
X
b
n
=
[
γ
v
a
r
W
]
×
X
i
n
+
[
γ
v
a
r
(
b
−
m
e
a
n
)
+
β
]
(
5
)
X_{bn} = [\frac{\gamma}{\sqrt{var}}W] \times X_{in} + [\frac{\gamma}{\sqrt{var}}(b - mean) + \beta] \space\space\space (5)
Xbn=[varγW]×Xin+[varγ(b−mean)+β] (5)
所以只需要通过训练得到的mean、var、
α
\alpha
α、
β
\beta
β通过如下式子修改原始的W和b即可:
W
n
e
w
=
γ
v
a
r
W
W_{new} =\frac{\gamma}{\sqrt{var}}W \space\space\space
Wnew=varγW
b
n
e
w
=
γ
v
a
r
(
b
−
m
e
a
n
)
+
β
\space\space\space b_{new}=\frac{\gamma}{\sqrt{var}}(b - mean) + \beta \space\space
bnew=varγ(b−mean)+β
- Caffe 中的合并层
layer {
bottom: "conv1"
top: "conv1"
name: "scale_conv1"
type: "Scale"
scale_param {
bias_term: true // 合并后的bias_term必须为true
}
}
参考
https://blog.csdn.net/zym19941119/article/details/84635371
https://blog.csdn.net/hjxu2016/article/details/81813535