pytorch有关闪击教程中使用的向后参数的问题

时间:2019-10-28 16:55:41

标签: pytorch

关于backward()的pytorch问题。在复制并粘贴到下面的pytorch blitz tutorial中,它们将向量[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]的原因,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

如文档所述,隐式地,不能为非标量输出创建grad。 y是非标量张量,您不能直接y.backward()。但是您可以向后传递向量以获取vector-Jacobian product。如果您不想更改渐变,则可以传入所有元素均为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])