You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何第二次调用GridSearchCV的fit方法会无限运行?

解决GridSearchCV二次调用fit无限运行的问题

我之前也碰到过一模一样的情况,这大概率是并行进程残留或者Keras/TensorFlow会话未正确清理导致的。当你设置n_jobs=-1时,GridSearchCV会启动多个子进程并行训练,第一次运行后部分子进程可能没有完全终止,第二次调用时就会出现资源死锁或进程阻塞的情况。下面是几个不用重启内核就能解决的方法:

方法1:显式清理TensorFlow会话与进程池

在第二次调用fit前,手动清理TF会话并终止之前的并行进程池,释放占用的资源:

import tensorflow as tf

# 清理TensorFlow的会话资源
tf.keras.backend.clear_session()

# 终止GridSearchCV的并行进程池(如果存在)
if hasattr(grid, '_pool'):
    grid._pool.terminate()
    grid._pool.join()

之后再重新定义GridSearchCV并执行fit:

batch_size = [5, 10, 15, 20]
param_grid = dict(batch_size = batch_size, epochs = epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X, y)

方法2:临时禁用并行(调试优先)

如果方法1没生效,可以先把n_jobs改为1,避免并行进程的干扰,确认参数调整后的代码能正常运行,再改回并行模式:

# 先单进程运行验证代码逻辑
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X, y)

方法3:重新初始化KerasClassifier实例

不要复用第一次的model对象,每次调整参数后重新创建一个全新的KerasClassifier实例,避免旧实例残留的会话或状态影响:

# 重新创建模型实例
model = KerasClassifier(build_fn=create_model, verbose=0)
batch_size = [5, 10, 15, 20]
param_grid = dict(batch_size = batch_size, epochs = epochs)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X, y)

问题根源说明

当使用n_jobs=-1时,scikit-learn会通过joblib启动多进程并行训练。第一次训练结束后,部分子进程可能因为Keras/TensorFlow的会话未自动关闭而残留,导致资源被持续占用,第二次并行训练时就会陷入死锁。显式清理会话和进程池,或者重新初始化模型,就能彻底释放这些资源,让第二次fit正常运行。

内容的提问来源于stack exchange,提问作者Fallen Apart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:55:04