Keras SparseCategoricalCrossentropy标签展平报错,多分类任务如何计算损失?
解决SparseCategoricalCrossentropy的标签格式错误问题
你的错误根源是SparseCategoricalCrossentropy仅支持稀疏类别索引标签,但你传入的真实标签是one-hot编码格式,两者形状不匹配导致报错。以下是两种直接解决方式:
方案1:将one-hot标签转换为类别索引
用tf.argmax把二维one-hot向量转成一维类别索引(比如[2, 0]),匹配SparseCategoricalCrossentropy的输入要求:
import tensorflow as tf # 真实one-hot标签转成类别索引 a = tf.constant([[0.,0.,1.],[1.,0.,0.]]) a_sparse = tf.argmax(a, axis=1) # 输出: [2, 0] # 预测输出 b = tf.constant([[0.,0.,1.],[0.,1.,0.]]) loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) loss = loss_object(a_sparse, b) print(loss.numpy())
方案2:改用CategoricalCrossentropy损失函数
如果想保留one-hot格式的真实标签,直接使用对应损失函数即可:
import tensorflow as tf a = tf.constant([[0.,0.,1.],[1.,0.,0.]]) b = tf.constant([[0.,0.,1.],[0.,1.,0.]]) # 匹配one-hot标签的损失函数 loss_object = tf.keras.losses.CategoricalCrossentropy(from_logits=True) loss = loss_object(a, b) print(loss.numpy())
补充说明
- 两个损失函数的核心差异:
SparseCategoricalCrossentropy接受一维类别索引,CategoricalCrossentropy接受二维one-hot编码。 - 参数
from_logits=True表示预测输出是未经softmax激活的原始logits值,损失函数内部会自动完成softmax计算;若预测输出已做softmax,需将该参数设为False。
内容的提问来源于stack exchange,提问作者Meep
相关产品推荐
相关产品推荐

