PyTorch里的requires_grad、volatile及no_grad

1. requires_grad

Variable变量的requires_grad的属性默认为False,若一个节点requires_grad被设置为True,那么所有依赖它的节点的requires_grad都为True。

x=Variable(torch.ones(1))
w=Variable(torch.ones(1),requires_grad=True)
y=x*w
x.requires_grad,w.requires_grad,y.requires_grad
Out[23]: (False, True, True)

y依赖于w,w的requires_grad=True,因此y的requires_grad=True (类似or操作)

2. volatile

volatile=True是Variable的另一个重要的标识,它能够将所有依赖它的节点全部设为volatile=True,其优先级比requires_grad=True高。因而volatile=True的节点不会求导,即使requires_grad=True,也不会进行反向传播,对于不需要反向传播的情景(inference,测试推断),该参数可以实现一定速度的提升,并节省一半的显存,因为其不需要保存梯度。
前方高能预警:如果你看完了前面volatile,请及时把它从你的脑海中擦除掉,因为

UserWarning: volatile was removed (Variable.volatile is always False)

该属性已经在0.4版本中被移除了,并提示你可以使用with torch.no_grad()代替该功能

x = torch.tensor([1], requires_grad=True)
with torch.no_grad():
...   y = x * 2
      y.requires_grad
False

@torch.no_grad()
def doubler(x):
      return x * 2
z = doubler(x)

z.requires_grad
False

参考文章: https://blog.csdn.net/jiangpeng59/article/details/80667335

注意:torch.Tensor生成的tensor,requires_grad默认为False。

    原文作者:yalesaleng
    原文地址: https://www.jianshu.com/p/ba203f4bcf4b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞