首页 > 解决方案 > 为什么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叶节点,yz不再是叶节点。是计算图中和x的叶节点,但没有从到的直接路径,因此返回 None。yzzytorch.autograd.grad

注意:返回值None不一定保证值为 0。

标签: pytorchautograd

解决方案


张量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]),)

推荐阅读