TensorFlow线性回归训练自定义数据集初始损失过高原因问询
根本原因
这是输入数据尺度不匹配+未做归一化导致的正常现象,和模型结构、训练配置本身无关:
- 你构造的测试集数值量级极小:特征范围是-714,标签范围是324,全是十几以内的小数值。Keras全连接层默认用Glorot均匀初始化,权重初始值都是围绕0的极小随机数,模型初始输出基本落在0附近,和小范围标签的绝对误差天然就小,初始MAE自然处于低区间。
- 薪资数据集的标签是千/万级别的大数值:薪资范围从2250到20000,特征(工作年限)范围是0~15。初始阶段模型输出还是在0附近,和几千上万的真实薪资算MAE,初始值到800完全符合预期,不是代码bug。
处理方案
- 先不用改模型,跑20个epoch观察损失曲线:如果损失能稳定快速下降,说明只是初始值尺度问题,不影响最终收敛结果,只是前期损失数值看起来大而已。
- 如果想压低初始损失、加快训练收敛速度,在把数据喂给模型前做标准化即可,参考代码:
from sklearn.preprocessing import StandardScaler # 分别对特征、标签做z-score标准化 x_scaler = StandardScaler() X_train = x_scaler.fit_transform(experience.values.reshape(-1, 1)) y_scaler = StandardScaler() y_train = y_scaler.fit_transform(salary.values.reshape(-1, 1)) # 用缩放后的数据训练 model.fit(X_train, y_train, epochs=150) # 推理预测后,记得用y_scaler.inverse_transform把结果转换回真实薪资量级
- 额外提个优化点:工作年限和薪资是近似线性关系,你现在用的50神经元+ELU激活的结构对于这个任务过于复杂,单特征线性回归用1个不带激活函数的Dense层就足够拟合,复杂结构反而容易在这个17条样本的小数据集上过拟合。
内容的提问来源于stack exchange,提问作者Emir Kutsal
相关产品推荐
相关产品推荐

