tips 关于BatchNorm的一些坑

最近在BatchNorm的问题上遇到了一些坑点,记录下来
BatchNorm在pytorch中是这么定义的
y = x E [ x ] V a r [ x ] + ϵ γ + β y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta
它会针对输入对数据进行归一化,使得空间变得规整,但是这个层不是单纯的归一化,它是有参数 γ \gamma β \beta 需要学习的,而且,BN层的实际定义还有其他的参数:

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

里面的track_running_stats=True,是在训练的过程中,bn层会跟踪不同batch的均值和方差,而如果设置为False,则不会跟踪
但是,即使设置了不跟踪,train和eval模式下bn的表现还是会不一样
这是由于 γ \gamma β \beta 在训练的过程中具有梯度会发生变化,而在eval的过程中由于权值被锁住,所以不会发生变化,这就导致尽管没有track之前的batch,但train和eval的表现依然不同

总结下来,bn有两个部分
一个是 γ \gamma β \beta ,一个是track的权值,前者受train和eval模式控制,后者受track_running_stats参数控制(控制指能否改变)

因此,当使用同一组数据train和eval的时候,网络输出在初期会有比较大的差异,但到后面会逐渐趋于相同

另外dropout也会导致train和eval表现不同的问题

猜你喜欢

转载自blog.csdn.net/u012397583/article/details/85056324