【发布时间】:2021-07-29 18:48:26
【问题描述】:
我已经进行了一些计算,试图计算结果的损失,并计算模型 w.r.t 的所有参数的梯度。那个损失。问题在于,计算中包含一个可调模型,我希望能够(最终)调整它。现在我只是想确认当模型参数用backward() 更新时我可以看到它们的梯度,但我不能,这就是问题所在。下面我发布代码、输出和所需的输出。
class ExpModelTunable(torch.nn.Module):
def __init__(self):
super(ExpModelTunable, self).__init__()
self.alpha = torch.nn.Parameter( torch.tensor(1.0, requires_grad=True) )
self.beta = torch.nn.Parameter( torch.tensor(1.0, requires_grad=True) )
def forward(self, t):
return self.alpha * torch.exp( - self.beta * t )
def func_f(t, t_list):
mu = torch.tensor(0.13191110355, requires_grad=True)
running_sum = torch.sum( torch.tensor( [ f(t-ti) for ti in t_list ], requires_grad=True ) )
return mu + running_sum
def pytorch_objective_tunable(u, t_list):
global U
steps = torch.linspace(t_list[-1].item(),u.item(),100, requires_grad=True)
func_values = torch.tensor( [ func_f(steps[i], t_list) for i in range(len(steps)) ], requires_grad=True )
return torch.log(U) + torch.trapz(func_values, steps)
def newton_method(function, func, initial, t_list, iteration=200, convergence=0.0001):
for i in range(iteration):
previous_data = initial.clone()
value = function(initial, t_list)
initial.data -= (value / func(initial.item(), t_list)).data
if torch.abs(initial - previous_data) < torch.tensor(convergence):
return initial
return initial # return our final after iteration
# call starts
f = ExpModelTunable()
U = torch.rand(1, requires_grad=True)
initial_x = torch.tensor([.1], requires_grad=True)
t_list = torch.tensor([0.0], requires_grad=True)
result = newton_method(pytorch_objective_tunable, func_f, initial_x, t_list)
print("Next Arrival at ", result.item())
这打印,输出是正确的,这里都很好:Next Arrival at 4.500311374664307。我的问题出现在这里:
loss = result - torch.tensor(1)
loss.backward()
print( result.grad )
for param in f.parameters():
print(param.grad)
输出:
tensor([1.])
None #this should not be None
None #this should not be None
所以我们可以看到结果变量的梯度正在更新,但模型f 的参数梯度没有得到更新。我试图返回所有的计算,所有的代码都在这里,并确保任何东西都有requires_grad=True,但我仍然无法让它工作。这应该有效吗?有人有任何提示吗?谢谢。
【问题讨论】: