如下代码会报错:RuntimeError: grad can be implicitly created only for scalar outputs

import torch
x=torch.ones(2,2,requires_grad=True)
print(x)
y=x+2
print(y)
#如果一个张量不是用户自己创建的,则有grad_fn属性.grad_fn 属性保存着创建了张量的 Function 的引用
print(y.grad_fn)
y.backward()
print(x.grad)

出错原因在于第8行

可以看到y是一个张量,张量不能使用backward(),需要转化为标量,

当然张量也是可以的,就是需要改动一处代码:

y.backward(torch.rand(2,2))

我们的返回值不是一个标量,所以需要输入一个大小相同的张量作为参数,这里我们用ones_like函数根据x生成一个张量。 个人认为,因为要对x求导数,所以函数y必须是求得的一个值,即标量。然后开始对x,y分别求偏导数。

import torch
x=torch.ones(2,2,requires_grad=True)
print(x)
y=x+2
print(y)
#如果一个张量不是用户自己创建的,则有grad_fn属性.grad_fn 属性保存着创建了张量的 Function 的引用
print(y.grad_fn)
y.backward(torch.rand(2,2))
print(x.grad)