出现Python scipy.optimize.fmin_l_bfgs_b梯度错误

2024-05-16 19:16:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用l_bfgs重复一篇对手的示例文章(FeatureAdversary)。当我使用作者的g = src.diff[0].flatten().astype(float)时,出现了一个错误。np.diff将形状更改为149856

F:\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in fmin_l_bfgs_b(func, x0, fprime, args, approx_grad, bounds, m, factr, pgtol, epsilon, iprint, maxfun, maxiter, disp, callback, maxls)
    197 
    198     res = _minimize_lbfgsb(fun, x0, args=args, jac=jac, bounds=bounds,
--> 199                            **opts)
    200     d = {'grad': res['jac'],
    201          'task': res['message'],

F:\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, **unknown_options)
    326         _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr,
    327                        pgtol, wa, iwa, task, iprint, csave, lsave,
--> 328                        isave, dsave, maxls)
    329         task_str = task.tostring()
    330         if task_str.startswith(b'FG'):

ValueError: 0-th dimension must be fixed to 150528 but got 149856

以下是原始代码:

def calc_gstep(cs_x, net, g_feat, end, objective, verbose=True):
    src = net.blobs['data']  # input image is stored in Net's 'data' blob
    dst = net.blobs[end]     # Guide image
    src.data[0][...] = cs_x.reshape(src.data[0].shape)
    
    next_layer = get_next_layer(end, net)
    net.forward(end=next_layer)
    rfeat = dst.data[0].copy()
    net.forward(end=end)
    # specify the optimization objective
    obj = objective(dst, g_feat, rfeat, verbose)
    net.backward(start=end)

    g = src.diff[0]

    return obj, g.flatten().astype(float)

我的损失函数是

class Evaluator(object):
    def __init__(self):
        self.loss_value = None
        self.grads_values = None

    def loss(self, x):        
        #x shape is (150528,)
        #src shape is (1, 3, 224, 224)
        src=Is_input.clone().numpy()
        src[0][...] = x.reshape(src[0].shape)

        x=torch.from_numpy(x.reshape(Ig_input.shape)).cuda().float()
        _,feat_x,_,_ = model(x)
        # minimize \\ q(I)-q(Ig)\\ , feat_k_guide is q(Ig)
        loss = torch.dist(feat_x,feat_k_guide,p=2)
        self.loss_value = loss

        #here, change to np.diff(src)
        g = np.diff(src)
        self.grad_values = g.flatten().astype(float)

        print(self.loss_value)
        return self.loss_value

    def grads(self, x):
        assert self.loss_value is not None
        grad_values = np.copy(self.grad_values)
        self.loss_value = None
        self.grad_values = None
        return grad_values

x, min_val, info = fmin_l_bfgs_b(evaluator.loss, Is_input.numpy().flatten()
                                 ,fprime=evaluator.grads
                                )

经过np.diff函数后,形状变为[1224224223]并导致问题。我应该采用什么梯度函数?谁能看一下吗?谢谢


Tags: selfsrctaskdatanetisvaluenp