Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别
思考
1、BN的好处? dropout的好处?
提高网络稳健性,避免网络过分依赖部分神经元。
2、model.train() 应该放在什么位置?
每个训练的 batch 中都需要进行。
/ ------- / ------- / ------- / ------- / ------- / ------- / ------- / ------- /
eval() 时,框架会自动把 BN 和 DropOut 固定住,不会取平均,而是用训练好的值,不然的话,一旦 test 的 batch_size 过小,很容易就会被 BN 层导致生成图片颜色失真极大!
eval 阶段,模型中使用的 dropout 或者 batch norm 失效,直接都会进行预测。
使用 no_grad 则让梯度 Autograd 设置为 False(因为在训练中我们默认是 True),保证了反向过程为纯粹的测试不变参数。
no_grad 避免每一个参数都要设置,解放了 GPU 底层的时间开销,在测试阶段统一梯度设置为 False 。