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

神经网络训练中损失函数值为NaN的问题求助

问题分析与解决方案

核心错误:损失函数与输出层不匹配

你的代码里最关键的问题是**SparseCategoricalCrossentropy的from_logits=True参数和模型最后一层的Softmax激活冲突**:

  • from_logits=True是告诉损失函数,模型输出的是未经激活的原始logits值,损失函数会内部自动执行Softmax计算。
  • 但你的模型最后一层已经用了Softmax做归一化,此时再启用from_logits=True会导致重复计算,引发数值下溢/上溢,最终损失值变为NaN。

修复步骤

  1. 修正损失函数参数:将from_logits改为False(或直接省略,默认值即为False):
    loss_f = tf.keras.losses.SparseCategoricalCrossentropy()
    # 或者显式声明:loss_f = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
    
  2. 替换准确率指标:由于你使用的是整数形式的标签(对应SparseCategoricalCrossentropy),应使用sparse_categorical_accuracy作为评估指标,而非适用于one-hot标签的categorical_accuracy:
    my_model.compile(loss=loss_f, optimizer=opt, metrics=["sparse_categorical_accuracy"])
    

关于"第二个epoch就达到100%准确率"的额外排查方向

这种异常的高准确率大概率不是模型性能完美,常见原因包括:

  • 数据泄露:训练集与验证集存在数据重叠,或特征中包含直接对应犯罪类别的编码信息(比如某特征就是类别ID)。
  • 任务特性:9个输入特征本身就能完全区分4类犯罪,但这种情况在真实场景中极少出现。
  • 类别严重不平衡:若某类犯罪样本占比极高,模型可能直接预测该类别就拿到高准确率,但100%的准确率更指向数据泄露问题。

建议先核对数据集划分逻辑,确保训练集与验证集无交集,同时检查特征是否存在直接泄露标签的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:20:27