python - 如何手动停止 scipy.optimize.fmin_l_bfgs_b 的优化过程?
问题描述
我正在使用spicy.optimize.fmin_l_bfgs_b
优化。
计算loss
和的计算器grad
由一个类实现
from calculator import loss_calculator
class one_batch:
def __init__(self, setup_dict):
self.setup_dict = setup_dict
def calculate(self):
temp_instance = loss_calculator(self.setup_dict, self.parameters)
self.loss, self.grad = temp_instance.result()
def objective_function(self, parameter):
self.parameters = parameters
self.calculate()
###########################################################
# I want to check if some convergence occures here. If #
# the convergence occurs, stop l-bfgs-b optimization. #
###########################################################
return self.loss, self.grad
为了优化,one_batch
每次加载新一批示例时都会创建一个实例。
from scipy.optimize import fmin_l_bfgs_b as optimizer
model_vector = initial_vector
for n in range(niter):
setup_dict = setup_dict # load the batch of examples
temp_batch = one_batch(setup_dict)
model_update = optimizer(temp_batch.objective_function, x0=model_vector)
model_vector = model_update
从代码中可以看出,我想要实现的是:
当optimizer
要求temp_batch.objective_function
最小化损失函数时,如果发生收敛,我想“打破”编码在spicy.optimize.fmin_l_bfgs_b
.
我怎样才能做到这一点?
解决方案
l_bfgs_b 算法的收敛相关参数是
factr
- 默认值为 1e7,如果您想提前停止拟合,请增加其值。
因子的典型值是: 1e12 表示低精度;1e7 中等精度;10.0 用于极高的精度。
如果您熟悉 optimize.minimize 函数,那么ftol
和之间的关系在文档factr
中给出。
请注意,ftol 选项是通过该接口提供的,而 factr 是通过该接口提供的,其中 factr 是乘以默认机器浮点精度以获得 ftol 的因子: ftol = factr * numpy.finfo(float).eps .
pgtol
:浮动,可选
当 max{|proj g_i | 时,迭代将停止。i = 1, ..., n} <= pgtol 其中 pg_i 是投影梯度的第 i 个分量。
试试这个,如果你想使用optimize.minimize方法l_bfgs_b
推荐阅读
- c# - 使用 System.Text.Encoding.Unicode.GetBytes(aString) 时是否应该检查字节顺序?
- google-sheets - 如何计算当天剩余时间
- python - python脚本 - 调用函数的问题
- javascript - 如何读取数组nodejs中存在的文件
- apache-spark - 我们可以为所有作业/应用程序使用相同的 Spark Config 吗?
- node.js - 无法使用 nestjs-joi lib 对 mongoose 模式进行验证
- python - 列表中的 Python 算法
- c++ - 如何在 C++ 中捕获异常?
- json - 无法使用 VBA 从网页解析 JSON 中的某个字段
- r - 如何使用 hist() 将统计信息放在输出图上?