我想知道我在下面的代码中犯了什么错误。我怀疑这是一些基本的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”参数,而且应该是有效的。
1条答案
按热度按时间mbyulnm01#
您必须传递函数对象本身而不是被求值的函数。删除func_to_opt的括号():
关于你的电话模特预测:你需要找出你的模型的输入形状。你必须输入一个列表,每个输入有一个元素。通常你只有一个输入。所以你必须把一个列表和一个元素输入到你的模型中。这个列表中元素的形状通常是这样的(无、N、C、H、W)。第一个维度是批次大小,第二个维度是通道大小,H=高度,W=宽度。如果您不处理图像,则输入形状可能为(无,N).尝试以下输入对象:
所以你需要改变
至
您也可以使用检查模型的输入形状