我正在使用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
中编码的优化过程。
我该怎么做?
答案 0 :(得分:0)
l_bfgs_b算法的收敛相关参数为
factr
-默认值为1e7,如果要及早停止拟合,请增加其值。factor的典型值为:1e12(低精度); 1e7的精度适中; 10.0具有极高的精度。
如果您熟悉optimize.minimize函数,那么documentation中将给出ftol
和factr
之间的关系。
请注意,通过该界面可以使用ftol选项,而 通过该接口提供factr,其中factor是因素 将默认的机器浮点精度乘以得出 ftol:ftol =事实* numpy.finfo(float).eps。
pgtol
:浮动,可选当max {| proj g_i | i = 1,...,n} <= pgtol 其中pg_i是投影渐变的第i个分量。
如果要使用l_bfgs_b