PyTorch设置为启用(假)与不启用(假):

PyTorch设置为启用(假)与不启用(假):,pytorch,Pytorch,假设autograd处于启用状态(默认情况下),执行以下操作之间是否存在任何差异(除了缩进): with torch.no_grad(): <code> 及 实际上没有,问题中使用的方式没有区别。当您查看no\u grad的源代码时。您可以看到,它实际上是在使用火炬。将_grad_enabled设置为存档此行为: class no\u grad(对象): 禁用渐变计算的r“”上下文管理器。 如果您确定,禁用渐变计算对于推断非常有用 你不会调用的:meth:`Tensor.b

假设autograd处于启用状态(默认情况下),执行以下操作之间是否存在任何差异(除了缩进):

with torch.no_grad():
    <code>


实际上没有,问题中使用的方式没有区别。当您查看
no\u grad
的源代码时。您可以看到,它实际上是在使用
火炬。将_grad_enabled
设置为存档此行为:

class no\u grad(对象):
禁用渐变计算的r“”上下文管理器。
如果您确定,禁用渐变计算对于推断非常有用
你不会调用的:meth:`Tensor.backward()`。它会减少内存
否则会有“requires\u grad=True”的计算消耗。
在此模式下,每次计算的结果都将
`requires_grad=False`,即使输入具有'requires_grad=True`。
也可以作为装饰。
例子::
>>>x=火炬。张量([1],需要_grad=True)
>>>使用手电筒。无梯度()
…y=x*2
>>>大学毕业生
假的
>>>@torch.no_grad()
…def倍增器(x):
…返回x*2
>>>z=倍频器(x)
>>>z.u梯度
假的
"""
定义初始化(自):
self.prev=torch.is_grad_enabled()
定义输入(自我):
火炬.\u C.设置\u梯度\u启用(错误)
定义退出(自我,*args):
火炬。设置\梯度\启用(自上)
返回错误
定义调用(self,func):
@functools.wrapps(func)
def装饰编号等级(*args,**kwargs):
与自我:
返回函数(*args,**kwargs)
返回装潢\u否\u梯度
但是,在
with
-语句中使用时,
torch还有一个附加功能。在
with
-语句中使用时,可控制打开或关闭梯度计算:

>x=torch.tensor([1],需要_grad=True)
>>>火车是假的吗
>>>带火炬。设置梯度已启用(是否为列车):
...   y=x*2
>>>大学毕业生


编辑:

@关于你的评论。我刚刚用PyTorch 1.0做了一个简短的测试,结果表明渐变将被激活:

import torch
w = torch.rand(5, requires_grad=True)
print('Grad Before:', w.grad)
torch.set_grad_enabled(False)
with torch.enable_grad():
    scalar = w.sum()
    scalar.backward()
    # Gradient tracking will be enabled here.
torch.set_grad_enabled(True)

print('Grad After:', w.grad)
输出:

Grad Before: None
Grad After: tensor([1., 1., 1., 1., 1.])
Grad Before: None
Grad After: tensor([1., 1., 1., 1., 1.])
因此,将在此设置中计算渐变

您在答案中发布的其他设置也会产生相同的结果:

import torch
w = torch.rand(5, requires_grad=True)
print('Grad Before:', w.grad)
with torch.no_grad():
    with torch.enable_grad():
        # Gradient tracking IS enabled here.
        scalar = w.sum()
        scalar.backward()

print('Grad After:', w.grad)
输出:

Grad Before: None
Grad After: tensor([1., 1., 1., 1., 1.])
Grad Before: None
Grad After: tensor([1., 1., 1., 1., 1.])
报告说:

no_grad
上下文中启用渐变计算。这在
no\u grad
之外没有影响

鉴于这一措辞,预计会出现以下情况:

torch.set_grad_enabled(False)
with torch.enable_grad:
    # Gradient tracking will NOT be enabled here.
torch.set_grad_enabled(True)
vs:

但正如所说,情况并非如此


我提出了一个问题。

相关:我相信我在下面的回答中发现了一个不同之处。但可能只是文档与代码不匹配。谢谢你的评论。为显示问题的代码干杯。似乎是一个文件问题。提出问题。嘿@TomHale,谢谢你的评论。请检查我的编辑,我只是做了一个快速测试,似乎他们两个版本在这方面是等效的。因此,渐变也将在您的第一个设置中启用。