pytorch: grad can be implicitly created only for scalar outputs

Posted peixu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch: grad can be implicitly created only for scalar outputs相关的知识,希望对你有一定的参考价值。

运行这段代码
import torch
import numpy as np
import matplotlib.pyplot as plt

x = torch.ones(2,2,requires_grad=True)
print(x:
,x)
y = torch.eye(2,2,requires_grad=True)
print("y:
",y)
z = x**2+y**3
z.backward()
print(x.grad,
,y.grad)

结果出现这个错误:RuntimeError: grad can be implicitly created only for scalar outputs

具体原因是什么呢,让我们看看z输出是什么:

z: tensor([[2., 1.],
        [1., 2.]], grad_fn=<AddBackward0>)

我们发现z是个张量,但是根据要求output即z必须是个标量,当然张量也是可以的,就是需要改动一处代码:

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

以上是关于pytorch: grad can be implicitly created only for scalar outputs的主要内容,如果未能解决你的问题,请参考以下文章

grad can be implicitly created only for scalar outputs

(已解决)多卡训练时报错RuntimeError: grad can be implicitly created only for scalar outputs

Pytorch 抛出错误 RuntimeError: result type Float can't be cast to the desired output type Long

PyTorch:The “freeze_support()” line can be omitted if the program is not going to be frozen

net.zero_grad() 与 optim.zero_grad() pytorch

python opencv error “parallel_impl.cpp (240) WorkerThread 155: Can‘t spawn new thread: res = 11“