如何使用Scipy优化功能

时间:2018-10-11 00:59:36

标签: python image optimization scipy keras

我正在学习使用scipy和keras进行图像样式迁移。我正在尝试运行示例代码,但scipy.optimize.fmin_l_bfgs_b出现错误:

x, min_val, info = fmin_l_bfgs_b(evaluator.loss, x.flatten(),fprime=evaluator.grads, maxfun=20, epsilon=1e-7)

但是我得到一个错误:

ValueError: failed to initialize intent(inout) array -- expected elsize=8 but got 4

其中Evaluator是Evaluator类的对象

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

    def loss(self, x):
        assert self.loss_value is None
        loss_value, grad_values = evalurateLossAndGrads(x)
        self.loss_value = loss_value
        self.grad_values = grad_values
        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是大小为512 * 512 * 3的图像。 如何解决此错误?非常感谢。

1 个答案:

答案 0 :(得分:1)

此错误是因为scipy的L-BFGS解算器的fortran实现需要8字节而不是4字节的浮点数。它要求您将初始x和渐变转换为float64数据类型。