scipy.optimize.differential_evolution -无法将要优化的函数传递到其中

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

我想知道我在下面的代码中犯了什么错误。我怀疑这是一些基本的python错误,与scipy无关。我正在尝试将一个要优化的函数传递给scipy。optimize。differential_evolution。

def func_to_opt(x, TRANS_MIN_BV=TRANS_MIN_BV, SUBS_VAL=100, model=model):
        """Returns Rsp if BV is above TRANS_MIN_BV, SUBS_VAL if not. Rsp and BV is calculated by model
        """
        y = model.predict(np.array([x]))
        y = np.array(y)[:, : ,0]
        y = np.swapaxes(y, 0, 1)
        print(y)
        print(TRANS_MIN_BV)
        if y[0, 0] > TRANS_MIN_BV:
            Rsp = y[0, 1]
        else:
            Rsp = SUBS_VAL
        return Rsp
GA = scipy.optimize.differential_evolution(func_to_opt(), bounds=trans_bounds.T.tolist(), maxiter=1e4)

我得到的错误是:

func_to_opt() missing 1 required positional argument: 'x'

但是如果我在这里写x,当然会产生误差

name 'x' is not defined

最后,如果我在这里输入一些任意序列,如[0.8,8,5e 16,2.001](它在界限内,y = model.predict(..)与它一起给出有效结果),它会给出一个隐含的错误:

The map-like callable must be of the form f(func, iterable), returning a sequence of numbers the same length as 'iterable'

问题是,根据https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.differential_evolution.html底部的那些示例,它的使用方式与我试图使用它的方式完全相同--他们定义了一个类似ackley(x)的函数,或者使用了scipy. optimiz.罗森,但他们将它传递到方法中时没有“x”参数,而且应该是有效的。

mbyulnm0

mbyulnm01#

您必须传递函数对象本身而不是被求值的函数。删除func_to_opt的括号():

GA = scipy.optimize.differential_evolution(func_to_opt, bounds=trans_bounds.T.tolist(), maxiter=1e4)

关于你的电话模特预测:你需要找出你的模型的输入形状。你必须输入一个列表,每个输入有一个元素。通常你只有一个输入。所以你必须把一个列表和一个元素输入到你的模型中。这个列表中元素的形状通常是这样的(无、N、C、H、W)。第一个维度是批次大小,第二个维度是通道大小,H=高度,W=宽度。如果您不处理图像,则输入形状可能为(无,N).尝试以下输入对象:

data = [0.8, 8, 5e16, 2.001]
batch_size = 1
[np.array(data).reshape(batch_size, len(data))]

所以你需要改变

np.array([x])

[np.array(x).reshape(1,len(x))]

您也可以使用检查模型的输入形状

model.inputs[0].shape

相关问题