1

Pytorch 版本 0.3.1

编辑:我正在重写这个问题以使其更简单,因为我已经缩小了错误的范围。

我有一些变量:

x = ag.Variable(torch.ones(1, 1), requires_grad = True)
y = ag.Variable(torch.ones(1, 1), requires_grad = True)
z = ag.Variable(torch.ones(1, 1), requires_grad = True)

然后我创建一个表示它们连接的变量:

w = torch.cat([x, y, z])
f = x + y + z

然后我尝试取导数:

ag.grad(f, x, retain_graph=True, create_graph=True)

这很好,并按预期返回 1。y 和 z 相同。

然而,

ag.grad(f, w, retain_graph=True, create_graph=True)

返回一个错误:RuntimeError: distinct input is unreachable

当然,这是有道理的—— w 没有在 . 的声明中明确使用f。但是,我想要一种行为,其中一行代码可以生成类似[1; 1; 1]输出的东西。

假设我想方便地将我的变量批处理在一起,然后一次获取整个 shebang 的梯度,而不是独立处理变量(这会使簿记成为一场噩梦)。有什么办法可以得到我想要的结果吗?

4

1 回答 1

1

像这样的东西有用还是你想保留f = x + y + z

w = torch.cat([x, y, z])
f = w[0] + w[1] + w[2]
print (ag.grad(f, w, retain_graph=True, create_graph=True))

# output (tensor([[ 1.],[ 1.],[ 1.]]),)
于 2018-05-16T10:55:04.753 回答