目录
- 问题描述
- 如果是bug
- batch size的设置问题
- 尝试使用GroupNorm解决batchsize不同带来的问题
- 归一化的分类
- 参考文章
问题描述
深度学习网络训练时,使用较小的batch size训练网络后,如果换用较大的batch size进行evaluation,网络的预测能力会显著下降。如果evaluation的batch size和train的batch size大小相同时,则不会遇到此类问题。
PyTorch Forums – Performance highly degraded when eval() is activated in the test phase
如果是bug
- metric会根据batch_size的大小变化(但并不显著),metric按每个batch分别进行计算
- 缺失
model.eval()
指令:with torch.no_grad()
对dropout和batch normalization不起固定作用。- nn.Dropout层参数不会固定
- nn.BatchNorm2d()
- PyTorch – BatchNorm2d BatchNorm2d函数中的参数
track_running_stats
:trainning
和track_running_stats
,track_running_stats=True
表示跟踪整个训练过程中的batch的统计特性,得到方差和均值,而不只是仅仅依赖与当前输入的batch的统计特性。相反的,如果track_running_stats=False
那么就只是计算当前输入的batch的统计特性中的均值和方差了。当在推理阶段的时候,如果track_running_stats=False
,此时如果batch_size
比较小,那么其统计特性就会和全局统计特性有着较大偏差,可能导致糟糕的效果。 trainning=False
,track_running_stats=True
。这个是期望中的测试阶段的设置,此时BN会用之前训练好的模型中的(假设已经保存下了)running_mean
和running_var
并且不会对其进行更新。一般来说,只需要设置model.eval()
其中model
中含有BN层,即可实现这个功能。
- PyTorch – BatchNorm2d BatchNorm2d函数中的参数
- Dataloader中加入了随机处理,例如RandomCrop
- 没有固定随机种子
batch size的设置问题
如果batch size较小,会导致上述running_mean和running_var不准确。参考文章Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift,当模型训练完成后,
x ^ = x − E [ x ] V a r [ x ] + ϵ \hat{x} = \frac{x-E[x]}{\sqrt{Var[x]+\epsilon}} x^=Var[x]+ϵx−E[x]
其中, V a r [ x ] = m m − 1 E B [ σ B 2 ] Var[x]=\frac{m}{m-1}E_B[\sigma_B^2] Var[x]=m−1mEB[σB2],the expectation is over training mini-batches of size m and σ B 2 \sigma_B^2 σB2 are their sample variances.
尝试使用GroupNorm解决batchsize不同带来的问题
归一化的分类
LN 和 IN 在视觉识别上的成功率都是很有限的,对于训练序列模型(RNN/LSTM)或生成模型(GAN)很有效。
所以,在视觉领域,BN用的比较多,GN就是为了改善BN的不足而来的。
GN 把通道分为组,并计算每一组之内的均值和方差,以进行归一化。GN 的计算与批量大小无关,其精度也在各种批量大小下保持稳定。可以看到,GN和LN很像。
参考文章
pytorch 每次测试结果不同
Batch Normalization
深度学习中的组归一化(GroupNorm)