pytorch - 关于闪电战教程中使用的反向参数的pytorch问题
问题描述
一个 pytorch 问题,关于backward()
. 在下面复制和粘贴的 pytorch blitz 教程中,它们将向量传递[0.1, 1.0, 0.0001]
给backward()
. 我可以直观地猜到为什么[0.1, 1.0, 0.0001]
传入的向量形状是 [3] ,但我不明白值 0.1, 1.0, 0.0001 来自哪里。我看过的另一个教程在一个中传递,这样在向量上向后完成是这样的:L.backward(torch.ones(L.shape))
# copied from blitz tutorial
Now in this case y is no longer a scalar. torch.autograd could not compute the full Jacobian directly, but if we just want the vector-Jacobian product, simply pass the vector to backward as argument:
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
如果有人能解释 [0.1, 1.0, 0.0001] 的原因,我将不胜感激。
解决方案
正如文件所说,隐含地,不能为非标量输出创建 grad 。y
是非标量张量,你不能y.backward()
直接。但是你可以传入一个向量来向后获取vector-Jacobian product
. 如果您不想更改 grads,您可以传入一个所有元素都是 1 的向量。
x = torch.tensor([2.,3.,4.], requires_grad=True)
y = x**2
y.backward() # error
y.backward(torch.tensor([1.,1.,1.])) # work
x.grad # tensor([4.,6.,8.])
# y.backward(torch.tensor([2.,2.,2.])) # change the passed vector.
# x.grad # tensor([8.,12.,16])
推荐阅读
- javascript - reactJS render() 方法中未定义属性值
- python - 如何从 views.py 文件中的 models.py 文件中获取任何特定字段?
- textinput - 谷歌助手文本输入
- webforms - 在 asp.net 中,使用 Page.LoadControl(path) 从另一个 Web 用户控件中加载 Web 用户控件
- typescript - 为 BelongsToMany 关联续集连接表列名称
- swift - SwiftUI:有些按钮出现,有些不出现 - MacOS 菜单栏应用程序
- node.js - 无法弄清楚如何在 Sequelize.js ORM 中创建表与其自身之间的多对多关系
- flutter - 如何在具有圆形边界的容器内居中图标小部件
- c# - 表单下载数据 OnStart() 或 OnAppearing()
- c# - 如何将 ComboBoxItem 设置为从其中的按钮中选择?