目录
1、简介
平时都是根据代码框架写代码,最近感觉是不是不用加model.train和model.eval是不是也行啥的,发现完全不是的,于是开始学习
2、区别
结论
- 主要是针对model 在训练时和评价时不同的 Batch Normalization 和 Dropout 方法模式。
-
启用 Batch Normalization 和 Dropout
-
不启用 Batch Normalization 和 Dropout
-
- 如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train(),在测试时添加model.eval()。
- 其中model.train()是保证BN层用每一批数据的均值和方差,而model.eval()是保证BN用全部训练数据的均值和方差(pytorch会自动把BN和DropOut固定住,不会取平均,而是用训练好的值);
- 而对于Dropout,model.train()是随机取一部分网络连接来训练更新参数,而model.eval()是利用到了所有网络连接。
联系Batch Normalization和Dropout的原理之后就不难理解为何要这么做了。
分析
Batch Normalization
BN主要时对网络中间的每层进行归一化处理,并且使用变换重构(Batch Normalizing Transform)保证每层所提取的特征分布不会被破坏,详细参加Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。该算法主要如下:
训练时是正对每个min-batch的,但是在测试中往往是针对单张图片,即不存在min-batch的概念。由于网络训练完毕后参数都是固定的,因此每个批次的均值和方差都是不变的,因此直接结算所有batch的均值和方差。所有Batch Normalization的训练和测试时的操作不同
Dropout
Dropout能够克服Overfitting,在每个训练批次中,通过忽略一半的特征检测器,可以明显的减少过拟合现象,详细见文章:Dropout: A Simple Way to Prevent Neural Networks from Overtting具体如下所示:
在训练中,每个隐层的神经元先乘概率P,然后在进行激活,在测试中,所有的神经元先进行激活,然后每个隐层神经元的输出乘P。
3、参考
Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别