引言
众所周知BN层在训练和测试时呈现出不同的计算法则,在训练时是对每个batch计算均值和方差,而在测试时则是用训练时batch的均值和方差对数据集整体进行无偏估计,具体可以参见我的另一篇博客:论文解析:Inception_V2(Batch Normalization)。因此我们在编程实现时需要根据所处阶段(训练或者推断)对BN层进行调整。
分析
对于如何根据所处阶段对BN层计算方式做出调整,网络上已经有了很多的介绍,即设置model.eval()。但有细心的朋友可能会发现,BN层初始化时存在一个track_running_stats参数,它的解释如下:
track_running_stats: a boolean value that when set to
True, this module tracks the running mean and variance, and when set toFalse, this module does not track such statistics, and initializes statistics buffers . Default:True
大意就是当这个参数为Ture时,BN模块会不断的跟进均值和方差,而在测试时则不会进行记录,并且会清空记录缓存。(这里涉及到pytorch里对BN层的处理方式,并不是真的存储了所有batch的均值和方差,在推断时统一处理,而是存在一种滑窗的机制,与此文无关不再细聊)。
但如果我们真的执行model.eval(),可以发现BN层的这一参数并未发生改变,测试如下:
model=nn.Sequential(
nn.Linear(64,32),
nn.BatchNorm1d(32),
nn.ReLU(),
)
model.eval()
Out[7]:
Sequential(
(0): Linear(in_features

本文揭示了在PyTorch中,通过model.eval()调整BN层运行模式的深层原因,介绍了track_running_stats与training属性的作用,并指出在实际操作中如何正确切换BN层的计算方式。

5194

被折叠的 条评论
为什么被折叠?



