Batch Size 不同对evaluation performance的影响

问题描述

深度学习网络训练时,使用较小的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

  1. metric会根据batch_size的大小变化(但并不显著),metric按每个batch分别进行计算
  2. 缺失model.eval()指令:with torch.no_grad() 对dropout和batch normalization不起固定作用。
    1. nn.Dropout层参数不会固定
    2. nn.BatchNorm2d()
      1. PyTorch – BatchNorm2d BatchNorm2d函数中的参数track_running_stats:trainningtrack_running_statstrack_running_stats=True表示跟踪整个训练过程中的batch的统计特性,得到方差和均值,而不只是仅仅依赖与当前输入的batch的统计特性。相反的,如果track_running_stats=False那么就只是计算当前输入的batch的统计特性中的均值和方差了。当在推理阶段的时候,如果track_running_stats=False,此时如果batch_size比较小,那么其统计特性就会和全局统计特性有着较大偏差,可能导致糟糕的效果。
      2. trainning=False, track_running_stats=True。这个是期望中的测试阶段的设置,此时BN会用之前训练好的模型中的(假设已经保存下了)running_meanrunning_var并且不会对其进行更新。一般来说,只需要设置model.eval()其中model中含有BN层,即可实现这个功能。
  3. Dataloader中加入了随机处理,例如RandomCrop
  4. 没有固定随机种子

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]+ϵ xE[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]=m1mEB[σ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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值