关于BatchNorm的一些坑
程序员文章站
2024-03-26 09:48:41
...
最近在BatchNorm的问题上遇到了一些坑点,记录下来
BatchNorm在pytorch中是这么定义的
它会针对输入对数据进行归一化,使得空间变得规整,但是这个层不是单纯的归一化,它是有参数和需要学习的,而且,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的表现还是会不一样
这是由于和在训练的过程中具有梯度会发生变化,而在eval的过程中由于权值被锁住,所以不会发生变化,这就导致尽管没有track之前的batch,但train和eval的表现依然不同
总结下来,bn有两个部分
一个是和,一个是track的权值,前者受train和eval模式控制,后者受track_running_stats参数控制(控制指能否改变)
因此,当使用同一组数据train和eval的时候,网络输出在初期会有比较大的差异,但到后面会逐渐趋于相同
另外dropout也会导致train和eval表现不同的问题
上一篇: 03.类的定义与使用
下一篇: apicloud的一些坑