SparseCategoricalCrossentropy

SparseCategoricalCrossentropy

我正在尝试了解TensorFlow中的此损失函数,但我不明白。这是SparseCategoricalCrossentropy。所有其他损失函数都需要具有相同形状的输出和标签,而该特定损失函数则不需要。

源代码:

import tensorflow as tf;

scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
  tf.constant([ 1,    1,    1,    2   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32)
);
print("Loss:", Loss.numpy());


错误是:

InvalidArgumentError: Received a label value of 2 which is outside the valid range of [0, 2).
Label values: 1 1 1 2 [Op:SparseSoftmaxCrossEntropyWithLogits]


如何为损失函数SparseCategoricalCrossentropy提供适当的参数?

最佳答案

SparseCategoricalCrossentropy和CategoricalCrossentropy都计算类别交叉熵。唯一的区别在于目标/标签应如何编码。

使用SparseCategoricalCrossentropy时,目标由类别的索引(从0开始)表示。输出的形状为4x2,这意味着您有两个类别。因此,目标应为4维向量,其条目为0或1。例如:

scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
  tf.constant([ 0,    0,    0,    1   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32))


与此相反,CategoricalCrossentropy的标签应进行一次热编码:

cce = tf.keras.losses.CategoricalCrossentropy();
Loss = cce(
  tf.constant([ [1,0]    [1,0],    [1, 0],   [0, 1]   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32))


当您有很多类别时,SparseCategoricalCrossentropy效率更高。

关于tensorflow - TensorFlow SparseCategoricalCrossentropy如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59787897/

10-12 18:00