个人认为,题主设置Batchsize=1可能是受限于计算资源只能设置Batchsize=1进行训练,或计算资源够,可以用大一点的Batchsize训练,但算法流程或者实例推理inference中有必须设置batchsize=1进行forward的需求,但往往Batchnorm层会写到模型中,大Batchsize训练时当然没问题,但带有BatchNorm进行单例forward的时候会出现error的情况。
前者就不建议使用BN了,没有什么用处(原因在后面),这里补充一下后者的处理方法,即BatchNorm(BN)怎样解决训练和推理时batch size不同的问题?
BatchNorm是在每个minibatch的维度上计算每个相同通道上的均值和方差,调整模型的一层输出时的分布,让模型在经过forward和backward优化时,取得更平滑一些的解。通常情况下,训练阶段的batchsize会设置较大,而有些时候进行推理inference时或者根据算法需要,batchsize会被我们考虑设置为1。这样的话,不同的minibatch训练得到不同的标准化,均值和方差这样的统计参数,而推理时只有一个样本,在只有1个向量的数据组上进行标准化后,成了一个全0向量,导致模型出现BUG。为了解决这个问题,不改变训练时的BatchNorm计算方式,仅仅改变推理时计算均值和方差方法,一种方法是如果在用于训练的数据集和要用于推理的数据集分布基本上差不多的时候,可以用训练集来近似对总体均值μ和总体标准差σ的估计。也可以考虑在batchsize=1的时候,进行推理时记得把model.eval()设置上,model.eval()时,网络模型中不启用 BatchNormalization 和 Dropout。