我想计算函数在几个点上的梯度。但是,如果我使用由
torch.arange
生成的张量,则不会计算梯度。相反,使用经典张量是可行的。为什么?
import torch
from torch import tensor
def l(w_1,w_2):
return w_1*w_2
w_1 = tensor(3., requires_grad=True)
w_2 = tensor(5., requires_grad=True)
l_v = l(w_1, w_2)
l_v.backward()
print(l_v.item(), w_1.grad, w_2.grad) # HERE WORKS OK
#############
for w_1_value in torch.arange(+2,+4,0.1, requires_grad=True):
for w_2_value in torch.arange(-2,+4,0.1, requires_grad=True):
print(w_1_value, w_2_value)
l_value = l(w_1_value, w_2_value)
l_value.backward()
print(l_value.item(), w_1_value.grad, w_2_value.grad) # HERE I GET NONE ON GRAD VALUES
梯度是在叶张量上计算的,在本例中是
torch.arange
张量本身。您需要访问这些张量的 grad
属性。
当您迭代
torch.arange
张量中的项目时,您将获得张量的视图,该视图没有梯度。
这适用于您想要做的事情:
w_1_values = torch.arange(+2,+4,0.1, requires_grad=True)
w_2_values = torch.arange(-2,+4,0.1, requires_grad=True)
for w_1_value in w_1_values:
for w_2_value in w_2_values:
l_value = l(w_1_value, w_2_value)
l_value.backward()
print(w_1_values.grad)
print(w_2_values.grad)