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

Keras训练回归模型时训练损失远高于验证损失求助

问题分析与解决方案

这种训练损失远高于验证损失的情况确实违反我们的直觉(通常是过拟合导致验证损失更高),结合你的代码和训练日志,我梳理了几个核心问题和对应的解决方法:

1. 训练集与验证集的顺序划分(最可能的原因)

你当前是直接按样本顺序取前2/3作为训练集、后1/3作为验证集:

xtrain=x[:,0:round(lenData*0.67)]
ytrain=y[0:round(lenData*0.67),]
xtest=x[:,round(lenData*0.67):round(lenData*1.0)]
ytest=y[round(lenData*0.67):round(lenData*1.0)]

如果你的虚拟函数样本是按输入变量的某种顺序排列的(比如x值递增/递减),训练集和验证集的数据分布会完全不同。比如假设你的函数在x较大的区域拟合难度更低,而验证集刚好落在这个区域,就会出现验证损失远低于训练损失的情况。

解决方法:使用随机划分代替顺序划分,直接用你已经导入的train_test_split:

# 替换原来的手动划分代码
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.33, random_state=seed)

这样能保证训练集和验证集的数据分布一致,避免因顺序导致的分布偏差。

2. 输入特征未做标准化处理

你只对输出y做了MinMaxScaler,但输入x完全没有做尺度调整:

# 仅处理了y,x未处理
scaler = MinMaxScaler(feature_range=(0, 1))
y = np.reshape(y, (y.shape[0],1))
y = scaler.fit_transform(y)

如果你的3个输入变量尺度差异较大(比如一个范围是0-1,另一个是1000-2000),模型训练时损失会被大尺度特征主导,同时训练过程会不稳定,也可能导致训练和验证损失出现反常的差距。

解决方法:对输入x也做标准化处理:

# 对x做MinMaxScaler
scaler_x = MinMaxScaler(feature_range=(0, 1))
x = scaler_x.fit_transform(x)

# 再进行随机划分
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.33, random_state=seed)

或者使用StandardScaler将特征标准化为均值0、方差1,根据你的数据特性选择即可。

3. 训练参数的潜在问题

(1)Batch Size设置

从训练日志看,每个epoch有4020个step,而你的训练样本数是4020,说明batch_size=1。过小的batch_size会导致训练损失的计算噪声更大(每个step只计算一个样本的损失),而验证损失是整个验证集的平均,会更平滑。你可以尝试调大batch_size,比如32、64,让训练损失的计算更稳定。

(2)学习率与训练轮次

你使用的Adam优化器学习率是1e-5,并且设置了decay=1e-6,训练了6000轮。学习率过低可能导致模型收敛速度慢,不过结合前面的分布问题,建议先解决数据划分和标准化后,再根据新的训练情况调整学习率和训练轮次。

4. 额外检查点

  • 确认你的虚拟函数生成的样本是否存在分布不均的情况,比如训练集中包含更多函数波动大的区域样本,而验证集刚好在平缓区域。
  • 可以绘制训练集和验证集的输入x的分布直方图,快速确认两者的分布是否一致,验证数据划分是否合理。

按照上述步骤调整后,应该能解决训练损失远高于验证损失的反常情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:22:55