pytorch - 为什么torch.autograd.grad() 使用torch.cat 返回None?
问题描述
如果渐变以某种方式停止,我知道torch.autograd.grad()
返回 None ,但是,我想知道下面的代码片段有什么问题?
x = torch.rand(6, requires_grad=True)
y = x.pow(2).sum()
z = torch.cat([x])
grad1 = torch.autograd.grad(y, x, allow_unused=True)
grad2 = torch.autograd.grad(y, z, allow_unused=True)
print(f'grad1 = {grad1}, grad = {grad2}')
输出是grad1 = (tensor([0.3705, 0.7468, 0.6102, 1.8640, 0.3518, 0.5397]),), grad = (None,)
。我期待与grad2
相同grad1
,因为z
本质上是x
. 请问我可以知道为什么吗?
更新:阅读帖子和@Ivan 的帮助后,我得出结论,原因是x
叶节点,y
但z
不再是叶节点。是计算图中和x
的叶节点,但没有从到的直接路径,因此返回 None。y
z
z
y
torch.autograd.grad
注意:返回值None
不一定保证值为 0。
解决方案
张量z
不用于计算 的值y
,因此它没有连接到它的计算图,并且你不会在 上得到梯度z
,因为它没有连接到y
。
另一方面,以下将起作用:
>>> y = x.pow(2).sum()
>>> torch.autograd.grad(y, x, allow_unused=True)
(tensor([0.3134, 1.6802, 0.1989, 0.8495, 1.9203, 1.0905]),)
>>> z = torch.cat([x])
>>> y = z.pow(2).sum()
>>> torch.autograd.grad(y, z, allow_unused=True)
(tensor([0.3134, 1.6802, 0.1989, 0.8495, 1.9203, 1.0905]),)
推荐阅读
- javascript - 如何使用 JavaScript 删除填充?
- python-3.x - Python Auto Click bot 不起作用,我不知道为什么
- php - 密码保护页面允许输入错误的密码
- prolog - !/0 是否应该穿过 (\+)/1 ?
- c++ - CMake & CodeSynthesis 仅标头库未编译
- asp.net-core - 如何将焦点设置在 Blazor.Typeahead 组件上?
- arrays - 从中心减小的Matlab数组
- primary-key - ERD - 具有不同于超类的复合键的子类
- python-3.x - 比较来自 OpenCV matchTemplate 的 maxVal 以进行动态模板匹配
- c# - SVG 图像作为 AppBarToggleButton 的图标应该看起来被禁用