pytorch:使用 arange 生成的张量进行 autograd

问题描述 投票:0回答:1

我想计算函数在几个点上的梯度。但是,如果我使用由

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
        
python pytorch gradient tensor autograd
1个回答
0
投票

梯度是在叶张量上计算的,在本例中是

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)
© www.soinside.com 2019 - 2024. All rights reserved.