python - 在pytorch中获取矢量化函数的梯度
问题描述
我是 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 can be implicitly created only for scalar outputs”
如何为向量调整此代码?
提前致谢,
解决方案
在这里您可以找到有关您的错误的相关讨论。
本质上,当您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 - 遍历数据框以将 str 转换为日期和时间 obj
- eclipse - Spring Tool Suite - 运行配置 - JUnit - 显示命令行 - 类路径信息在哪里?
- node.js - ReactJS 中的 API 调用并设置对状态的响应
- c++ - 将二进制数据 (.tec) 读入 C++ 程序变量矩阵
- mysql - 关于Mysql文件打孔,何时以及如何报“no space left”错误?
- python - 如何从文本中提取提及特定单词和/或短语的推文?
- javascript - TypeError:stripHtml 不是函数
- node.js - Sonos Simulator 无法编译节点包
- regex - 在 pyspark 中使用 rlike 加入数据帧时包括括号
- python - 好奇~在下面的代码中的作用