本文主要是介绍model.eval()与with torch.no_grad(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
requires_grad、volatile与no_grad
- requires_grad
- volatile
- no_grad
- model.eval()与with torch.no_grad()
总结:
requires_grad=True 要求计算梯度;
requires_grad=False 不要求计算梯度;
model.eval()中的数据不会进行反向传播,但是仍然需要计算梯度;
with torch.no_grad()或者@torch.no_grad()中的数据不需要计算梯度,也不会进行反向传播。(torch.no_grad()是新版本pytorch中volatile的替代)
requires_grad
requires_grad是Variable变量中的一个属性,requires_grad的属性默认为False,若一个节点requires_grad被设置为True,那么所有依赖它的节点的requires_grad都为True,此时要求计算tensor的梯度。
volatile
volatile是Variable的另一个重要的标识,它能够将所有依赖它的节点全部设为volatile=True,优先级比requires_grad=True高。
而volatile=True的节点不会求导,即使requires_grad=True,也不会进行反向传播,对于不需要反向传播的情景(inference,测试阶段推断阶段),该参数可以实现一定速度的提升,并节省一半的显存,因为其不需要保存梯度。
但是, 注意 volatile已经取消了,使用with torch.no_grad()来替代。
no_grad
torch.no_grad() 是一个上下文管理器,被该语句内部的语句将不会计算梯度。
torch.no_grad()是新版本pytorch中volatile的替代。
model.eval()与with torch.no_grad()
※ 共同点:
在PyTorch中进行validation时,使用这两者均可切换到测试模式。
如用于通知dropout层和batchnorm层在train和val模式间切换。
在train模式下,dropout网络层会按照设定的参数p设置保留激活单元的概率(保留概率=p); batchnorm层会继续计算数据的mean和var等参数并更新。
在val模式下,dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值。
※ 不同点:
-
model.eval()会影响各层的gradient计算行为,即gradient计算和存储与training模式一样,只是不进行反传。
-
**with torch.zero_grad()**则停止autograd模块的工作,也就是停止gradient计算,以起到加速和节省显存的作用,从而节省了GPU算力和显存,但是并不会影响dropout和batchnorm层的行为。
也就是说,如果不在意显存大小和计算时间的话,仅使用model.eval()已足够得到正确的validation的结果;而with torch.zero_grad()则是更进一步加速和节省gpu空间(因为不用计算和存储gradient),从而可以更快计算,也可以跑更大的batch来测试。
参考:
torch.no_grad
with torch.no_grad() 详解
torch.no_grad与验证模式
这篇关于model.eval()与with torch.no_grad()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!