神经网络训练中损失函数值为NaN的问题求助
问题分析与解决方案
核心错误:损失函数与输出层不匹配
你的代码里最关键的问题是**SparseCategoricalCrossentropy的from_logits=True参数和模型最后一层的Softmax激活冲突**:
from_logits=True是告诉损失函数,模型输出的是未经激活的原始logits值,损失函数会内部自动执行Softmax计算。- 但你的模型最后一层已经用了
Softmax做归一化,此时再启用from_logits=True会导致重复计算,引发数值下溢/上溢,最终损失值变为NaN。
修复步骤
- 修正损失函数参数:将
from_logits改为False(或直接省略,默认值即为False):loss_f = tf.keras.losses.SparseCategoricalCrossentropy() # 或者显式声明:loss_f = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) - 替换准确率指标:由于你使用的是整数形式的标签(对应
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
相关产品推荐
相关产品推荐

