TensorFlow早停报错:val_loss指标不可用,求解决方案
解决思路
1. 直接修复警告问题
警告的核心原因是:你在重新训练最佳模型时(grbe=grid.best_estimator_.fit(X_train, y_train)),没有传入验证集参数,导致模型训练时没有验证集,EarlyStopping监控的val_loss指标不存在。
解决方法二选一:
- 方法一:给最佳模型训练加上验证集
修改最后一行代码,加上model__validation_split=0.2参数,让模型训练时生成验证集,这样val_loss就会被计算:grbe = grid.best_estimator_.fit(X_train, y_train, model__validation_split=0.2) - 方法二:仅在网格搜索时启用早停
如果不需要在最佳模型的二次训练中使用早停,可以把EarlyStopping的回调仅传入网格搜索的训练流程:- 修改KerasClassifier的定义,移除固定的callbacks参数:
('model', KerasClassifier(build_fn=create_model, verbose=2)) - 在grid.fit时传入回调和验证集参数:
grid_result = grid.fit(X_train, y_train, model__validation_split=0.2, model__callbacks=[early_stopping])
- 修改KerasClassifier的定义,移除固定的callbacks参数:
2. 修复潜在的数据泄露问题
当前使用sklearn的Pipeline会导致SMOTE被应用到验证集上,这会污染验证数据,影响模型评估的准确性。正确的做法是使用imblearn的Pipeline,它会自动区分采样步骤和转换步骤,仅在训练集上执行SMOTE:
- 安装imblearn(如果没装):
pip install imbalanced-learn - 导入imblearn的Pipeline:
from imblearn.pipeline import Pipeline - 保持原有的steps定义不变,只是替换Pipeline的来源即可。
3. 可选:规范指标名称
将model.compile中的metrics=['Recall']改为metrics=['recall'],符合Keras指标名称的小写规范,避免可能的名称匹配问题。
内容的提问来源于stack exchange,提问作者xavi
相关产品推荐
相关产品推荐

