Pytorch torch.Tensor.backward()是如何工作的?

Pytorch torch.Tensor.backward()是如何工作的?,pytorch,gradient,torch,Pytorch,Gradient,Torch,我最近研究了Pytorch和backward函数的包。 我知道如何使用它,但当我尝试 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.]]). 为什么会发生这种情况?事实上,这就是您要寻找的:

我最近研究了Pytorch和backward函数的包。 我知道如何使用它,但当我尝试

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.]]).

为什么会发生这种情况?

事实上,这就是您要寻找的:

情况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.]])
tensor([[4., 4.],
        [4., 4.]])
tensor([[1., 1.],
        [1., 1.]])
案例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([[25., 25.],
        [25., 25.]])
tensor([[4., 4.],
        [4., 4.]])
tensor([[1., 1.],
        [1., 1.]])
案例3:当z=x时(您的案例)

输出:

tensor([[25., 25.],
        [25., 25.]])
tensor([[4., 4.],
        [4., 4.]])
tensor([[1., 1.],
        [1., 1.]])

要了解更多如何在pytorch中计算梯度,请检查。

我想您误解了如何使用
张量.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;否则就没有参数。

所以我猜向后()中张量的形状指定了输出的形状。尺寸的作用是什么?仅仅是一个乘法?这相当于
dy_dx=grad(输出=y,输入=x,grad_输出=torch.one像(y))
你在上面传递的是x,它是张量([[2,2.],[2,2.]))