触发嵌套的“ KeyboardInterrupt” try-except

时间:2019-05-16 03:03:46

标签: python exception scikit-learn mathematical-optimization keyboardinterrupt

在诸如搜索或优化之类的区域中,某些功能(例如sklearn.neural_network.MLPRegressor.fit)的设计使其在发送KeyboardInterrupt时会立即返回当前的最佳结果(而不是引发异常)。从需要结果的角度来看,这很方便。

但是,如果我有一个使用此函数作为子例程的元优化例程,那么我的主例程将没有机会接收KeyboardInterrupt,并且它将继续运行,这使该程序成为可能。 “势不可挡”。

一个例子是:

from sklearn.neural_network import MLPRegressor
def optimize_many_times_and_take_best(x, y, model=MLPRegressor()):
    best = -1
    try:
        for i in range(20):
            best = max(best, model.fit(x, y).score(x, y))
    except KeyboardInterrupt:
        pass
    return best

当我按下Ctrl-C时,model.fit将立即返回,而optimize_many_times_and_take_best将继续其for循环,因为它没有收到任何KeyboardInterrupt。它会在很短的时间内再次调用model.fit,在停止程序之前,我必须非常快地按Ctrl-C很多次。

我想知道,对于这种嵌套的KeyboardInterrupt陷阱,是否有任何好的解决方案来中断所有优化例程?

在这种情况下,由于MLPRegressorUserWarning上发出了KeyboardInterrupt,因此我可以捕获警告,但是有更好的解决方案吗?我是否必须为所有循环显式编写某种消息机制(例如warnings或某些bool)?

0 个答案:

没有答案