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

未编码标签用Sparse Categorical Entropy损失出现NaN问题咨询

问题原因解析

这个问题的核心原因是**sparse_categorical_crossentropy损失函数对输入标签的格式有严格要求**——它只接受非负整数形式的类别索引,且索引范围必须是0到num_classes - 1(这里你的输出层是2个神经元,所以合法索引只能是0和1)。下面具体拆解不同标签格式的表现差异:

为什么原始-1/1标签会导致NaN?

sparse_categorical_crossentropy的计算逻辑是:将标签视为类别索引,提取模型softmax输出中对应索引位置的概率值,然后通过-log(对应概率)计算损失。

当你的标签是-1时,这属于无效索引(你的输出只有索引0和1的两个神经元),会触发内部计算的非法操作(比如尝试访问数组的负索引),直接引发数值异常,最终导致损失变为NaN,准确率也无法正常统计。

为什么其他两种标签格式能正常训练?

  • One-Hot编码标签 + categorical_crossentropy:
    categorical_crossentropy接受的是与模型输出维度一致的概率分布标签(比如[1,0]对应类别0,[0,1]对应类别1),它直接计算两个概率分布之间的交叉熵,不需要依赖索引匹配,因此-1/1转成One-Hot后完全符合要求,训练过程正常。

  • Ordinal Encoder转成0/1标签 + sparse_categorical_crossentropy:
    此时标签刚好是合法的类别索引(0对应第一个输出神经元,1对应第二个),损失函数可以正常提取对应位置的概率值计算交叉熵,因此不会出现数值异常。

关于“对称标签导致训练问题”的补充

你提到的“围绕0的对称标签引发问题”,本质不是对称本身的问题,而是这类标签不符合sparse_categorical_crossentropy的输入规范。如果你的场景是二分类,其实更推荐用Dense(1, activation='sigmoid')搭配binary_crossentropy——不过这时候仍需要将标签转成0/1(因为binary_crossentropy期望标签值在0到1之间),直接转换标签格式是最简便的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:48:10