简要版解释
在PyTorch中进行validation或者test的时侯,会使model.eval()
切换到测试模式,在该模式下,model.training=Fasle
,其作用是:1.dropout层会让所有的激活单元都通过,2.batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值。
但是该模式不会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反向传播(back probagation)
而model.train()
则不同,在train模式下,dropout网络层会按照设定的参数p设置保留激活单元的概率(保留概率=p); batchnorm层会一直计算数据的mean和var等参数并更新。
注意:定义了模型之后,默认model.training=True。
with torch.no_grad()
则主要是用于停止autograd模块的工作,以起到加速和节省显存的作用,也就是不保存计算图,默认是保存的。
深入版解释
上面这些东西只是非常浅层的解释,但是对于技术控恐怕难以满足,尤其是你打算长期做这一块,而且经常做模型训练效果分析的同学来说,上面这个解释是完全不够的。
对于model.eval() 和model.train()上面已经说了,有一些深度学习中的机制例如batchnorm在这两个模式下,工作模式是不同的。怎么个不同呢?我们以batchnorm为例,可以参考BN中的对应章节来揭开batchnorm的用法以及其工作模式。
对于torch.no_grad(),你甚至不知道上面是什么东西,说得非常抽象,这个东西,你得先看看计算图是什么?你就明白了。见计算图。