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

Keras回归模型训练后所有输入返回相同输出的问题排查

故障原因排查

模型训练后所有输出完全一致属于典型的模型塌缩问题,由以下几个硬错误直接导致:

  • 隐藏层激活函数完全选错:第一层Dense层接softmax激活是核心错误。softmax会将整层所有神经元的输出压缩为总和为1的概率分布,仅适合多分类任务的输出层,用在隐藏层会直接把大部分神经元的输出压到接近0,触发梯度消失,模型参数完全无法更新。
  • 中间层维度配置错误:你在第二层Dense手动指定了input_shape=(16,),但Sequential模型仅需要给第一层设置输入维度,中间层会自动匹配上一层的输出尺寸——你第一层输出是50维,手动写的16维输入配置不仅不生效,还反映出层间维度传递逻辑的配置混乱,第二层直接从50维无过渡压到2维,信息损失极大。
  • 激活函数适配性错误:第二层用sigmoid激活,该函数在输入值远离0的区间梯度趋近于0,训练初期参数随机的情况下很容易直接进入饱和区,梯度无法回传,模型学不到任何特征。
  • 输出维度和需求不匹配:你明确提到预期输出18个数据点,但当前最后一层Dense仅设置了2个神经元,输出维度和任务要求完全不对齐。
  • 大概率损失函数选错:从你用的激活函数组合来看,很可能误套用了分类任务的交叉熵损失来做回归任务,损失计算逻辑和任务目标不匹配,直接导致模型收敛到常数输出的局部最优解。
对应解决思路

按照以下步骤逐一修正即可解决问题:

  • 替换隐藏层激活函数:所有隐藏层去掉softmax、sigmoid,换成relu或者LeakyReLU这类适配隐藏层的激活,从根源避免梯度消失。
  • 删除中间层多余的input_shape配置:仅保留第一层的input_shape=(2,)即可,中间层不需要手动指定输入维度,框架会自动适配。
  • 对齐输出层维度:如果确实需要输出18个连续值,把最后一层Dense的神经元数量改成18;如果是输出单个对象的经纬度2个值,就保留2个神经元,无检测对象输出0的逻辑可以在推理阶段做阈值后处理,不需要在模型结构里特殊适配。
  • 匹配回归任务的训练配置:回归任务不要用交叉熵损失,选择MSE、MAE或者Huber损失,优化器用Adam即可,输出层保留linear激活是正确的,不需要修改。
  • 训练前做数据归一化:把输入的x/y坐标、输出的经纬度都缩放到0~1区间或者标准化为均值0、方差1的分布,避免数值尺度过大导致训练不稳定。如果数据里无对象的负样本占比过高,要适当调整采样比例,避免模型直接学“全输出0”的懒解。

修正后的基础参考模型代码如下:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
# 第一层隐藏层,输入2维坐标
model.add(Dense(64, input_shape=(2,), activation='relu'))
# 第二层隐藏层增强拟合能力
model.add(Dense(32, activation='relu'))
# 输出层,按实际需求调整神经元数量,回归任务用线性激活
model.add(Dense(18, activation='linear'))
# 编译配置
model.compile(optimizer='adam', loss='mse')

内容的提问来源于stack exchange,提问作者나니모

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:18:14