在诸如搜索或优化之类的区域中,某些功能(例如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
陷阱,是否有任何好的解决方案来中断所有优化例程?
在这种情况下,由于MLPRegressor
在UserWarning
上发出了KeyboardInterrupt
,因此我可以捕获警告,但是有更好的解决方案吗?我是否必须为所有循环显式编写某种消息机制(例如warnings
或某些bool
)?