我尝试将SciPyoptimize
模块中的minimize
应用于我自己的成本函数:
result = minimize(cost_function, initial_params, args = (TEXT_IMG, BINARY_MASK), method = 'BFGS')
我需要第一个参数是一个奇数,比如31:
initial_params = np.array([31, 2, -7])
但是minimize开始在31周围迭代,只使用浮点数,我的代价函数崩溃了;是否有可能实现边界和约束,以便minimize保持提供数字,如31,29,33等?
我已经读到我可能需要使用differential_evolution
而不是minimize
,但只是为了确保。
编辑:
这是成本函数:
def abs_diff(mask1, mask2):
diff = np.abs(mask1 - mask2)
mean_diff = np.mean(diff)
return mean_diff
def cost_function(params, text_img, binary_mask):
blockSize, C, h = params
hColor = -3
templateWSize = 5
searchWSize = 5
denoised = cv2.fastNlMeansDenoisingColored(text_img, h, hColor, templateWSize, searchWSize)
gray_denoised = cv2.cvtColor(denoised, cv2.COLOR_BGR2GRAY)
imgf = cv2.adaptiveThreshold(gray_denoised, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, blockSize, C)
error = abs_diff(binary_mask * 255, imgf)
return error
1条答案
按热度按时间oxf4rvwz1#
像BFGS这样的方法不太适合离散值参数。
实用的解决方案是对所有16个
blockSize
值进行优化,并选择最佳结果。或者,您可以在使用之前通过缩放和舍入
blockSize
来“欺骗”,以使初始发行版具有良好的覆盖率。如果你有更多的离散参数(尤其是布尔型参数),那么另一种选择是将这个问题视为超参数优化。要么对这些参数进行随机搜索,要么使用类似ray tune的东西,这基本上是一个并行的随机搜索,当它开始看起来很糟糕时,它也支持在内部“训练循环”上提前停止。(内部循环将使用比随机搜索更强的算法来优化剩余的连续参数。
另一种替代方法是CEM(交叉熵方法),它允许混合离散和连续分布。但是对于实值参数,它可能会收敛到比BFGS更差的解。遗传算法也可以工作,但是考虑到你使用的是scipy.optimize,它可能会涉及太多的设置和手工制作。