1、什么是BN层
批归一化(Batch Normalization)可以加速神经网络训练、使网络训练更稳定,而且还有一定的正则化效果,所以得到了非常广泛的应用。但是,在推理阶段,BN层一般是可以完全融合到前面的卷积层的,而且丝毫不影响性能。
2、BN层和卷积层融合原理
假设对一个Batch内第个样本,神经元输出为
,BN层的输出可以表示为:
其中,为一个Batch的均值;
为一个Batch的标准差;
为极小数,防止除数为0;
Conv层的计算可以表示为:
二者可以融合表示为:
3、Python代码
if layer == 'Convolution':
# save weights and bias when meet conv layer
if 'weight' in name:
weights = params.data
bias = torch.zeros(weights.size()[0])
elif 'bias' in name:
bias = params.data
bn_param = {}
return weights
elif layer == 'BatchNorm':
# save bn params
bn_param[name.split('.')[-1]] = params.data
# running_var is the last bn param in pytorch
if 'running_var' in name:
# let us merge bn ~
tmp = bn_param['weight'] / torch.sqrt(bn_param['running_var'] + 1e-5)
weights = tmp.view(tmp.size()[0], 1, 1, 1) * weights
bias = tmp*(bias - bn_param['running_mean']) + bn_param['bias']
return weights, bias