model.eval()跟torch.no_grad()的区别

model.eval() 负责改变batchnorm、dropout的工作方式,如在eval()模式下,dropout是不工作的。batchnorm是固定均值方差的,不会再根据test的输入重新计算均值方差;
torch.no_grad()仅仅是关闭梯度计算,节约内存;

a) model.eval(),不启用 BatchNormalization 和 Dropout。此时pytorch会自动把BN和DropOut固定住,不会取平均,而是用训练好的值。不然的话,一旦test的batch_size过小,很容易就会因BN层导致模型performance损失较大;

b) model.train() :启用 BatchNormalization 和 Dropout。 在模型测试阶段使用model.train() 让model变成训练模式,此时 dropout和batch normalization的操作在训练q起到防止网络过拟合的问题。

因此,在使用PyTorch进行训练和测试时一定要记得把实例化的model指定train/eval。

只进行inference时,model.eval()是必须使用的,否则会影响结果准确性。 而torch.no_grad()并不是强制的,只影响运行效率。

猜你喜欢

转载自blog.csdn.net/weixin_39326879/article/details/120798799