我正在训练图像多分类器。 在 Keras 中使用损失 SparseCategoricalCrossentropy。 我在下面发现了一个问题。
import tensorflow as tf
a=tf.constant([[0.,0.,1.],[1.,0.,0.]])
b=tf.constant([[0.,0.,1.],[0.,1.,0.]])
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss = loss_object(a, b)
a 代表我的 2 个输入数据的真实标签。 b 代表我的 2 个输入数据的预测标签。 计算出现以下错误。
ValueError: `labels.shape` must equal `logits.shape` except for the last dimension. Received: labels.shape=(6,) and logits.shape=(2, 3)
不知何故,真正的标签被扁平化并且变得不可计算。 我该如何处理这个问题来计算关于 2 个输入数据的 SparseCategoricalCrossentropy?
您的标签并不稀疏,它们是单热编码的,这意味着
SparseCategoricalCrossentropy
不起作用。要解决这个问题,请更改
a=tf.constant([[0.,0.,1.],[1.,0.,0.]])
到
a=tf.constant([2., 0.])
这会起作用,因为 a 是调用损失函数的第一个参数,它是基本事实,或者
y_true
:
loss = loss_object(a, b)
b
可以进行单热编码,因为 TensorFlow 会将其转换为正确的格式,但这似乎只有在 a
已经采用正确(稀疏)格式的情况下才有效。