一般的标准卷积结构为:
Conv2d(24, 88, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(88, eps=0.001, momentum=0.01, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
原因:
BN层的公式:
tmp = (x - mean) / sqrt(var + eps)
result = tmp *gamma + beta
参数解释:
- x 代表输入的原始数据
- mean 代表输入数据的均值
- var 代表输入数据的方差
- eps 代表一个很小的常数,通常用于防止方差为0的情况
- gamma 是可学习的缩放参数。
- beta 是可学习的平移参数。
- sqrt代表开平方
这里主要看tmp就够了,如果卷积存在bias:
看分子:x-mean 变成 (x+bias) - (mean + bias), 那就等于没加一样。
看分母:var公式
这里面的Xi-X 和 分子 x-mean是同样的道理依然会导致bias相互抵消。
结论就是:分子和分母中的bias完全不起作用,再加上BN本身有beta存在,完全不需要卷积的bias了。因为不起作用,而且设为True之后占显卡内存
故有BN层的时候,通常将bias设为False(题外话:bias=False时,会影响模型的Flops和params的计算)