Keras训练ANN时隐藏进度条及解决代码重运行冻结问题求助
我来帮你一步步搞定这几个问题哈:
先解决代码重运行冻结的核心问题
终端不重启就卡壳,本质是TensorFlow的会话没彻底释放CPU/GPU资源,导致第二次运行时无法初始化新的会话。你可以在代码末尾加一段资源清理的代码,确保每次运行完都释放资源:
from keras import backend as K import tensorflow as tf # 清理Keras后端资源 K.clear_session() # 关闭TensorFlow会话(适配TF1.x,你的Python3.5.4对应的应该是TF1.x版本) tf.Session().close()
要是偶尔还是有残留进程,也可以在终端用ps aux | grep python找到残留的Python进程,用kill -9 [进程ID]手动杀掉。
禁用Keras训练进度条(解决GridSearchCV仍显示进度的问题)
GridSearchCV的verbose=0只能关闭它自己的日志,Keras模型训练时的进度条是Keras自身的输出,得从Keras这边下手禁用。有两种简单方法:
- 全局禁用日志:在代码最开头加这几行,直接屏蔽Keras和TensorFlow的冗余输出:
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' import keras keras.utils.disable_interactive_logging() - 配合模型包装禁用:下面会提到用
KerasClassifier包装模型,那时可以直接在包装时指定verbose=0,从根源上关掉训练进度条。
修复
fit() got an unexpected keyword argument 'verbose'报错 你直接把Keras模型传给GridSearchCV的estimator是不对的——GridSearchCV需要的是符合scikit-learn接口的估计器,Keras模型得用KerasClassifier(分类任务专用)包装一下才能兼容。这也是你传verbose参数报错的核心原因,因为GridSearchCV的fit方法根本不接受这个参数。
正确的操作步骤是:
- 把你的模型定义成一个单独的构建函数:
def create_model(): # 这里写你原来model1的定义代码,比如: model = Sequential() model.add(Dense(64, activation='relu', input_dim=X_train.shape[1])) model.add(Dense(2, activation='sigmoid')) # 根据你的分类类别数调整 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model - 用
KerasClassifier包装这个函数,同时设置verbose=0:from keras.wrappers.scikit_learn import KerasClassifier model1 = KerasClassifier(build_fn=create_model, verbose=0) - 再把包装好的模型传给GridSearchCV,之后直接调用
fit就行,不用再加verbose参数:search = GridSearchCV(estimator=model1, param_grid=params, scoring='accuracy', cv=10, n_jobs=-1, verbose=0) grid_search = search.fit(X_train, y_train)
综合完整代码示例
把上面的步骤整合起来,你的代码应该是这样的:
import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import GridSearchCV from keras import backend as K import tensorflow as tf import os # 全局禁用冗余日志 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' import keras keras.utils.disable_interactive_logging() # 定义模型构建函数 def create_model(): model = Sequential() model.add(Dense(64, activation='relu', input_dim=X_train.shape[1])) model.add(Dense(2, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model # 包装模型并关闭训练进度条 model1 = KerasClassifier(build_fn=create_model, verbose=0) # 你的参数网格 params = { 'batch_size': [16, 32], 'epochs': [10, 20] } # 初始化GridSearchCV search = GridSearchCV(estimator=model1, param_grid=params, scoring='accuracy', cv=10, n_jobs=-1, verbose=0) # 开始训练 grid_search = search.fit(X_train, y_train) # 训练完成后清理资源,避免重运行冻结 K.clear_session() tf.Session().close()
这样三个问题应该都能解决:重运行不会卡壳、训练时没有进度条输出、也不会再出现verbose参数的报错。
内容的提问来源于stack exchange,提问作者Emil Filipov
相关产品推荐
相关产品推荐

