我是个新手,我一直在尝试一些自动梯度的例子,看看我是否理解它。我对以下代码为什么不能工作感到困惑:
def Loss(a):
return a**2
a=torch.tensor(3.0, requires_grad=True )
L=Loss(a)
L.backward()
with torch.no_grad(): a=a+1.0
L=Loss(a)
L.backward()
print(a.grad)我们得到的不是输出8.0,而是"RuntimeError:张量的元素0不需要梯度,也没有grad_fn“
发布于 2022-08-02 17:59:20
关于您的代码,有两件事需要注意:
a,这意味着梯度应该累积。换句话说,您应该得到一个等于da²/da + d(a+1)²/da的梯度,它等于2a + 2(a+1),也就是2(2a + 1)。如果是14.,那么a.grad将等于
torch.no_grad上下文管理器,这意味着您将无法执行来自任何结果张量的反向传播,即在这里a本身。下面是一个代码片段,它生成所需的结果,即14作为两个梯度的累积:
>>> L = Loss(a)
>>> L.backward()
>>> a.grad
6
>>> L = Loss(a+1)
>>> L.backward()
>>> a.grad
14 # as 6 + 8https://stackoverflow.com/questions/73209559
复制相似问题