Scipy最小化、优化LBFGS与PyTorch LBFGS

iklwldmw  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(212)

我已经用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文档,但不太明白它们在这里是如何应用的:

m4pnthwp

m4pnthwp1#

问题是我使用了错误的“objective”函数。我试图优化的是x_0数组,因此我不得不将代码修改如下:

for i in range(10):
   optimizer.zero_grad()
   x_0.backward(gradient = calc_gradient(x_0, const_data))
   optimizer.step(lambda: calc_cost(x_0, const_data))
   h_lbfgs.append(objective.item())

相关问题