以前一直有个疑问,开始建立好模型,如果既没有执行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