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:区分输入无法访问
当然这是有道理的 - 在f
的声明中没有明确使用w。但是,我想要一种行为,其中一行代码可以生成类似[1; 1; 1]
的输出。
假设我想方便地将我的变量一起批量处理,然后立即采用整个shebang的梯度,而不是独立处理变量(这可能使簿记成为一场噩梦)。有没有办法得到我想要的结果?
答案 0 :(得分:0)
这样的事情是否有用,或者你想保留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.]]),)