首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autograd火炬

Autograd火炬
EN

Stack Overflow用户
提问于 2022-08-02 14:48:06
回答 1查看 51关注 0票数 0

我是个新手,我一直在尝试一些自动梯度的例子,看看我是否理解它。我对以下代码为什么不能工作感到困惑:

代码语言:javascript
复制
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“

EN

回答 1

Stack Overflow用户

发布于 2022-08-02 17:59:20

关于您的代码,有两件事需要注意:

  1. ,您正在执行两个反向繁殖,直到叶a,这意味着梯度应该累积。换句话说,您应该得到一个等于da²/da + d(a+1)²/da的梯度,它等于2a + 2(a+1),也就是2(2a + 1)。如果是14.

,那么a.grad将等于

  1. 您使用的是torch.no_grad上下文管理器,这意味着您将无法执行来自任何结果张量的反向传播,即在这里a本身。

下面是一个代码片段,它生成所需的结果,即14作为两个梯度的累积:

代码语言:javascript
复制
>>> L = Loss(a)
>>> L.backward()
>>> a.grad
6

>>> L = Loss(a+1)
>>> L.backward()
>>> a.grad
14 # as 6 + 8
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73209559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档