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

标签 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)

但我收到错误“运行时错误:只能为标量输出隐式创建 grad”

如何为向量调整此代码?

提前致谢,

最佳答案

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)

关于python - 在pytorch中获取矢量化函数的梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55749202/

相关文章:

python - 用整数替换 numpy 数组中的 RGB 值非常慢

Python fork : 'Cannot allocate memory' if process consumes more than 50% avail. 内存

machine-learning - 在pytorch中,向后方法的第一个参数(梯度)是什么?

javascript - 实现基本的数学表达式简化器

python - 如何在 Rust 中收集传感器数据并使其在 Python 中可查询/可用?

c - 在 C 中使用预训练的 pytorch 模型?

python - PyTorch 梯度对于 CUDA 和 CPU 具有不同的形状

r - 在 R 中绘制 nls 模型的导数

python - 构建多维微分矩阵

python - 如何限制 python 程序的最大 CPU 使用率