在pytorch中获取矢量化函数的梯度

时间:2019-04-18 15:24:45

标签: python pytorch derivative autodiff

我是PyTorch的新手,想做我认为很简单的事情,但遇到很多困难。

我有函数sin(x) * cos(x) + x^2,我想随时获取该函数的派生词。

如果我做到这一点,它就和

一样完美
x = torch.autograd.Variable(torch.Tensor([4]),requires_grad=True)
y = torch.sin(x)*torch.cos(x)+torch.pow(x,2)
y.backward()
print(x.grad) # outputs tensor([7.8545])

但是,我希望能够将向量作为x传递,并使其能够按元素求导数。例如:

Input: [4., 4., 4.,]
Output: tensor([7.8545, 7.8545, 7.8545])

但是我似乎无法正常工作。

我只是尝试做

x = torch.tensor([4., 4., 4., 4.], requires_grad=True)
out = torch.sin(x)*torch.cos(x)+x.pow(2)
out.backward()
print(x.grad)

但是我收到错误消息“ RuntimeError:只能为标量输出隐式创建grad”

如何针对矢量调整此代码?

预先感谢

1 个答案:

答案 0 :(得分:2)

Here,您可以找到有关您的错误的相关讨论。

实质上,当您不带参数调用backward()时,它会隐式转换为backward(torch.Tensor([1])),其中torch.Tensor([1])是计算梯度的输出值。

如果您传递4(或更多)输入,则每个输入都需要一个用于计算梯度的值。您可以像这样将torch.ones_like显式传递给backward

import torch

x = torch.tensor([4.0, 2.0, 1.5, 0.5], requires_grad=True)
out = torch.sin(x) * torch.cos(x) + x.pow(2)
# Pass tensor of ones, each for each item in x
out.backward(torch.ones_like(x))
print(x.grad)