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:\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分別求偏導數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM