pytorch中net.eval() 和net.train()的使用

以前一直有个疑问,开始建立好模型,如果既没有执行net.train()也没有执行net.eval()时候模型处于哪种情况?

近天测试了一下,建立好的模型是处于 .train()模式下的:

建立好的模型

调试过程中查看网络的 net.training 的值。


调试查看

然后执行下一步net.eval(),之后查看net.training 的属性值:


执行net.eval()

net.training的布尔值

然后执行net.train()查看一下net.training的值:
执行net.train()

执行net.train()之后的net.training的布尔值

下面进行一组对照试验,验证网络处于 train 或 eval 模式中的时候,最后的出的结果是不一样的 :

训练完train_datasets之后,model要来测试样本了。在model(test_datasets)之前,需要加上model.eval(). 否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有batch normalization层所带来的的性质。
eval()时,pytorch会自动把BN和DropOut固定住,不会取平均,而是用训练好的值。
不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大。eval()在非训练的时候是需要加的,没有这句代码,一些网络层的值会发生变动,不会固定,你神经网络每一次生成的结果也是不固定的,生成质量可能好也可能不好。
这几篇博客较好的解释了droupout和BN层:
深度学习(二十九)Batch Normalization 学习笔记(赞赞)
Batch Normalization 简单理解

1.当模型始终处于 train 模式中:

图片.png

结果:


图片.png

2.当模型始终处于 eval 模式中:

图片.png

结果:


图片.png

3. 当模型先处于eval 模式,后处于train 模式:

图片.png

结果:


图片.png

4. 当模型先处于train 模式,后处于train 模式:

图片.png

结果:


图片.png

推荐阅读更多精彩内容