我在尝试理解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开始)。你的输出形状为4×2,这意味着你有两个类别。因此,目标应该是一个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会更加高效。