我最近研究了Pytorch和程序包的向后功能。 我知道如何使用它,但是当我尝试
x = Variable(2*torch.ones(2, 2), requires_grad=True)
x.backward(x)
print(x.grad)
我希望
tensor([[1., 1.],
[1., 1.]])
因为它是一个身份函数。但是,它返回
tensor([[2., 2.],
[2., 2.]]).
为什么会这样?
答案 0 :(得分:0)
实际上,这就是您要寻找的:
情况1:当z = 2 * x ** 3 + x
import torch
from torch.autograd import Variable
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x*x*x*2+x
z.backward(torch.ones_like(z))
print(x.grad)
输出:
tensor([[25., 25.],
[25., 25.]])
情况2:当z = x * x
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x*x
z.backward(torch.ones_like(z))
print(x.grad)
输出:
tensor([[4., 4.],
[4., 4.]])
案例3:当z = x(您的情况)
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x
z.backward(torch.ones_like(z))
print(x.grad)
输出:
tensor([[1., 1.],
[1., 1.]])
要了解更多有关如何在pytorch中计算梯度的信息,请选中this。
答案 1 :(得分:0)
我认为您误解了如何使用tensor.backward()
。 backward()
中的参数不是dy / dx的x。
例如,如果通过某种操作从x获得y,则y.backward(w)
,首先pytorch将获得l = dot(y,w)
,然后计算dl/dx
。
因此,对于您的代码,l = 2x
首先由pytorch计算,然后dl/dx
是您的代码返回的内容。
当您执行y.backward(w)
时,如果y不是标量,只需使backward()
的参数全为1。否则就没有参数。