我已经用scipy.optimize.minimize
写了一些使用LBFGS算法的代码,现在我想用PyTorch实现同样的代码。
科学版:
res = minimize(calc_cost, x_0, args = const_data, method='L-BFGS-B', jac=calc_grad)
def calc_cost(x, const_data):
# do some calculations with array "calculation" as result
return np.sum(np.square(calculation)) #this returns a scalar!
def calc_grad(x, const_data):
# do some calculations which result in array "calculation"
return np.ravel(calculation) #in PyTorch this returns without ravel!
现在在PyTorch中,我遵循this example。但是,我想使用我自己的梯度计算。这会导致错误RuntimeError: Mismatch in shape: grad_output[0] has a shape of torch.Size([3, 200, 200]) and output[0] has a shape of torch.Size([]).
。我知道梯度的形状/大小 * 应该 * 与目标函数相同。(即这里是标量),但这不是我需要的(见上文)。我如何修改下面的代码,使其执行与Scipy版本相同的计算:
optimizer = optim.LBFGS([x_0], history_size=10, max_iter=10, line_search_fn="strong_wolfe")
h_lbfgs = []
for i in range(10):
optimizer.zero_grad()
objective = calc_cost(x_0, const_data)
objective.backward(gradient = calc_gradient(x_0, const_data))
optimizer.step(lambda: calc_cost(x_0, const_data))
h_lbfgs.append(objective.item())
我已经看过PyTorch文档,但不太明白它们在这里是如何应用的:
- https://pytorch.org/docs/stable/generated/torch.optim.LBFGS.html
- https://pytorch.org/docs/stable/optim.html#optimizer-step-closure
1条答案
按热度按时间m4pnthwp1#
问题是我使用了错误的“objective”函数。我试图优化的是
x_0
数组,因此我不得不将代码修改如下: