欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于BatchNorm的一些坑

程序员文章站 2024-03-26 09:48:41
...

最近在BatchNorm的问题上遇到了一些坑点,记录下来
BatchNorm在pytorch中是这么定义的
y=xE[x]Var[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表现不同的问题