Pytorch 梯度计算

Pytorch 梯度计算,pytorch,Pytorch,我想在以下场景中计算梯度: y=w_0x+w_1和z=w_2x+(dy/dx)^2 w=torch.tensor([2,1,3.],需要_grad=True) x=火炬。张量([0.5],需要_grad=True) y=w[0]*x+w[1] y、 向后() l=x梯度 l、 需要_grad=True w、 零度梯度 z=w[2]*x+l**2 z、 向后() 我期望得到[4,0,0.5],而不是[0,0,0.5]。我知道在这种情况下,我可以用w_0代替l,但是,l可以是x的复函数,在这种情况

我想在以下场景中计算梯度: y=w_0x+w_1和z=w_2x+(dy/dx)^2

w=torch.tensor([2,1,3.],需要_grad=True)
x=火炬。张量([0.5],需要_grad=True)
y=w[0]*x+w[1]
y、 向后()
l=x梯度
l、 需要_grad=True
w、 零度梯度
z=w[2]*x+l**2
z、 向后()

我期望得到[4,0,0.5],而不是[0,0,0.5]。我知道在这种情况下,我可以用w_0代替l,但是,l可以是x的复函数,在这种情况下,重要的是我用数值计算梯度,而不是改变z的表达式。请让我知道我需要做什么更改以获得正确的渐变w.r.t w

您应该一路打印渐变,这样会更容易。 我将注释代码中的内容:

import torch

w = torch.tensor([2.0, 1.0, 3.0], requires_grad=True)
x = torch.tensor([0.5], requires_grad=True)
y = w[0] * x + w[1]
y.backward()
l = x.grad
l.requires_grad = True
print(w.grad) # [0.5000, 1.0000, 0.0000] as expected
w.grad.zero_()
print(w.grad) # [0., 0., 0.] as you cleared the gradient
z = w[2] * x + l ** 2
z.backward()
print(w.grad) # [0., 0., 0.5] - see below
Last
print(w.grad)
的工作原理是这样的,因为你使用的是张量的最后一个元素,它是方程
z
的唯一部分,它乘以
x
,即
0.5
,因此梯度是
0.5
。之前,您通过发出
w.grad\u zero\(
)清除了渐变。我看不出你怎么能得到
[4,0,0.5]
。如果你没有清除梯度,你会得到:
张量([0.5000,1.0000,0.5000])
,前两个来自第一个
y
方程,第二个和最后一个来自
z
方程