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

Keras Sequential模型处理标签shape为(3,)数据集时loss为nan问题求助

问题解决方案

核心错误原因

  • 输出层激活函数与损失函数不匹配:回归任务下输出层使用了仅适用于分类任务的softmax,该激活会强制输出和为1的概率值,搭配回归损失MSE会严重限制输出范围,直接导致数值计算异常出现nan
  • 全层使用线性激活:多层线性激活叠加等价于单层线性变换,无非线性拟合能力,且极易出现梯度爆炸/消失引发数值溢出
  • 指标选择错误:accuracy是分类任务专属指标,回归任务下该数值无参考意义,你当前得到的0.33准确率仅为随机匹配结果

修复代码

请先确认你的任务类型,对应选择适配代码:

场景1:回归任务(标签(3,)为任意连续数值,不需要概率输出)

model_Test_1 = tf.keras.Sequential([
    tf.keras.layers.Conv2D(37, (1,1), padding='same', activation='relu',
                           input_shape=(37,1,1)),
    tf.keras.layers.Conv2D(74, (2,1), padding='same', activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(147, activation='relu'),
    tf.keras.layers.Dense(3, activation='linear')
])

model_Test_1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
              loss= tf.keras.losses.MeanSquaredError(),
              metrics=['mae'] )

场景2:多分类任务(标签(3,)为one-hot编码的分类标签,取值仅为0/1)

model_Test_1 = tf.keras.Sequential([
    tf.keras.layers.Conv2D(37, (1,1), padding='same', activation='relu',
                           input_shape=(37,1,1)),
    tf.keras.layers.Conv2D(74, (2,1), padding='same', activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(147, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])

model_Test_1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
              loss= tf.keras.losses.CategoricalCrossentropy(),
              metrics=['accuracy'] )

如果你的分类标签是整数形式(单值表示类别,shape为(1,)而非one-hot的(3,)),将损失函数替换为tf.keras.losses.SparseCategoricalCrossentropy()即可。

额外排查项

  • 确认输入数据不存在nan/无穷大值,归一化操作避免除0
  • 如果修复后仍出现nan,可在优化器中添加梯度裁剪:optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4, clipvalue=1.0)

内容的提问来源于stack exchange,提问作者Noé Abdou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:18:01