未编码标签用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

