Pytorch之autograd错误:RuntimeError: grad can be implicitly created only for scalar outputs

考研人信息库

此公众号会发表计算机考研(初复试信息)、夏令营等资料,方便考研人对信息的获取,节约自身查找资料的时间,回复408,可获得数据结构、操作系统、计算机网络、计算机组成原理全科资料


 

前言

标量是0阶张量(一个数),是1*1的;
向量是一阶张量,是1*n的;
张量可以给出所有坐标间的关系,是n*n的。
所以通常有人说将张量(n*n)reshape成向量(1*n),其实reshape过程中并没有发生大的变化。

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)

运行结果 

Pytorch之autograd错误:RuntimeError: grad can be implicitly created only for scalar outputs_第1张图片

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

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

z.backward(torch.ones_like(x))

我们的返回值不是一个标量,所以需要输入一个大小相同的张量作为参数,这里我们用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.ones_like(x))
print(x.grad)

运行结果

Pytorch之autograd错误:RuntimeError: grad can be implicitly created only for scalar outputs_第2张图片

你可能感兴趣的:(Pytorch,python,机器学习)