Keras使用SparseCategoricalCrossEntropy时如何匹配输出列与真实类别标签
解决思路
SparseCategoricalCrossEntropy要求输入的真实标签为0 ~ 类别数-1的连续整数索引,你只需要提前建立离散原始标签和整数索引的固定映射关系,就能直接对应模型输出的每一列含义,无需使用独热编码,完全适配内存受限的场景:
- 生成固定标签映射表
对你的5个原始标签[1.03, 2.07, -2.09, -974, 366],分别分配0~4的唯一整数索引,生成双向映射字典:
该映射表需要在训练、预测全流程保持一致,此时模型输出的# 原始标签转训练用整数索引 label_to_idx = {1.03:0, 2.07:1, -2.09:2, -974:3, 366:4} # 预测输出索引转原始标签 idx_to_label = {v:k for k,v in label_to_idx.items()}(None, 5)张量中,第i列就对应索引i的原始标签的预测概率,比如第0列对应标签1.03的概率,第1列对应2.07的概率,以此类推。 - 训练阶段适配
把训练数据的原始标签全部通过label_to_idx转换为整数索引,直接传给SparseCategoricalCrossEntropy作为目标值即可,无需转换为独热编码,几乎不产生额外内存开销:loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) # 若模型最后一层未加softmax激活,将from_logits设置为True - 预测阶段取值
如果你需要获取某个原始标签对应的预测概率,先查映射表拿到对应索引,再取输出张量对应列的数值即可;如果你需要得到预测的原始标签,先通过tf.argmax(预测输出, axis=-1)得到预测的整数索引,再通过idx_to_label转换为原始标签值即可。
内容的提问来源于stack exchange,提问作者Nikhil Mishra
相关产品推荐
相关产品推荐

