運行這段代碼
import torch import numpy as np import matplotlib.pyplot as plt x = torch.ones(2,2,requires_grad=True) print('x:\n',x) y = torch.eye(2,2,requires_grad=True) print("y:\n",y) z = x**2+y**3 z.backward() print(x.grad,'\n',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分別求偏導數。