bn层需要初始化的参数主要是scale和bias,bias一般初始化为0,scale有两种初始化方式
# Zero-initialize the last BN in each residual branch,
# so that the residual branch starts with zeros, and each residual block behaves like an identity.
# This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
if zero_init_residual:
for m in self.modules():
if isinstance(m, Bottleneck):
nn.init.constant_(m.bn3.weight, 0)
elif isinstance(m, BasicBlock):
nn.init.constant_(m.bn2.weight, 0)
if isinstance(m, nn.Linear):
nn.init.normal_(m.weight, 0, 0.01) #均值为0, 方差为0.01
nn.init.zeros_(m.bias)
(1)Xavier 初始化:、
如果是高斯分布,就直接初始化为均值为0,方差为
Xavier 初始化的方法是基于激活函数的输出的均值是0的。因为我们在推导的过程中都是令输入X的的期望为0,即E(X)=0来推导的,而实际中sigmoid函数函数等并不是0均值的
(2)He初始化:
在He初始化中可以选择mode为:fan_in或者fan_out,有博主总结:
- 如果权重是通过层(卷积或全连接)隐性确定的,则需设置mode=fan_in;
- 如果通过创建随机显式创建权重,则应进行设置mode=‘fan_out’。
我看了下各大主流的模型如mobilenet_v2,resnet都采用的是mode=‘fan_out’