TensorFlow回归用EarlyStopping和Dropout出现欠拟合问题
同时使用EarlyStopping与Dropout出现欠拟合的排查与修复
核心成因
- Dropout配置与任务规模不匹配
本次任务仅包含5个输入特征,属于复杂度极低的回归任务,无正则的小型全连接网络即可达到和线性回归相当的拟合效果。当前配置在每一层隐藏层后都添加0.2比率的Dropout,训练时每层随机失活20%神经元,多层叠加后网络的有效拟合容量被大幅压缩,本身就会提升欠拟合风险。同时Dropout会给训练过程的损失曲线引入随机噪声,损失不会像无正则场景下平滑单调下降,会出现持续的上下波动。 - EarlyStopping配置容错性不足,被噪声误触发
现有早停配置仅设置patience=25,且未开启restore_best_weights参数。Dropout带来的损失波动会让早停逻辑误判验证损失已连续25轮无有效下降,在模型尚未收敛时就提前终止训练;即使训练过程中曾出现过最优权重点,未配置权重恢复的情况下,最终保留的是早停触发轮次的未收敛权重,进一步拉低模型效果。 - 验证集使用逻辑错误
现有代码直接将测试集作为验证集传入训练流程,既会造成测试集数据泄露,也无法为早停提供稳定的泛化性能参考。
修复方案
按优先级依次调整即可:
- 精简正则配置:对于这类低复杂度小数据集任务,小型网络本身很难出现过拟合,可直接移除Dropout;如果需要保留正则,将Dropout率降至0.1以下,且仅在最后1-2层隐藏层添加,不要每层叠加。
- 调整早停参数适配损失波动:
early_stopping = EarlyStopping( monitor='val_loss', mode='min', patience=50, # 提升容忍轮次,过滤随机波动的干扰 restore_best_weights=True, # 训练结束后自动恢复验证损失最优轮次的权重 min_delta=100 # 针对MAE的量级设置,小于100的损失波动不算有效提升 ) - 修正数据集拆分逻辑:从训练集中单独拆分10%-20%样本作为验证集供早停监控,测试集仅在最终模型评估时使用,不参与训练过程的任何决策。
- 调整后可复现正常效果的参考代码:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.callbacks import EarlyStopping # 数据预处理与拆分 X = df[df.columns[:-2]].values y = df['Price'].values # 先拆分出独立测试集 X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 从训练剩余样本中拆分验证集 X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.2, random_state=42) scaler = MinMaxScaler() X_train = scaler.fit_transform(X_train) X_val = scaler.transform(X_val) X_test = scaler.transform(X_test) # 模型构建 model = Sequential() model.add(Dense(5, activation='relu')) model.add(Dense(5, activation='relu')) model.add(Dense(5, activation='relu')) model.add(Dropout(0.05)) # 仅在最后一层隐藏层加极低比率Dropout model.add(Dense(5, activation='relu')) model.add(Dense(1)) model.compile(optimizer='adam', loss='mae') # 模型训练 history = model.fit( X_train, y_train, validation_data=(X_val, y_val), epochs=600, callbacks=[early_stopping] )
效果验证标准
调整后早停不会在300轮前误触发,最终模型在测试集上的MAE会稳定在80K-85K区间,和无正则网络、线性回归的效果基本持平,不会出现明显欠拟合。
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

