sparse_categorical_crossentropy和categorical_crossentropy有什么区别?

时间:2019-10-25 20:33:19

标签: python tensorflow machine-learning keras deep-learning

sparse_categorical_crossentropycategorical_crossentropy有什么区别?什么时候应该使用一种损失而不是另一种?例如,这些损失是否适合线性回归?

3 个答案:

答案 0 :(得分:3)

简单地:

  • categorical_crossentropy使用单热点数组来计算概率,
  • 稀疏...使用类别索引

共有五类。

  • cce:一个热点是[0,1,0,0,0]模型预测:[。2,.5,.1,.1,.1](可能是正确的)
  • 稀疏:索引是[1]模型预测:[.5]

3个类别

  • cce:一个热点是[0,0,1]模型预测:[。5,.1,.4](可能不准确)
  • 稀疏:索引为[0]模型预测:[.5]

大多数分类模型会产生单熵和分类熵,因为使用稀疏模型可以节省空间但会丢失很多信息(例如,在第二种情况下,索引2也非常接近)。我总是一口气研究cce输出以确保模型的可靠性。

简而言之:当类互斥时,即您根本不在乎其他足够接近的预测,请使用稀疏categorical_crossentropy。

答案 1 :(得分:2)

我也对这个感到困惑。幸运的是,优秀的 keras 文档帮助了我们。两者都有相同的损失函数,最终做的是同样的事情,唯一的区别在于真实标签的表示。

  • 分类交叉熵 [Doc]:
<块引用>

当有两个或多个标签时使用这个交叉熵损失函数 类。我们希望以 one_hot 表示形式提供标签。

>>> y_true = [[0, 1, 0], [0, 0, 1]]
>>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
>>> # Using 'auto'/'sum_over_batch_size' reduction type.  
>>> cce = tf.keras.losses.CategoricalCrossentropy()
>>> cce(y_true, y_pred).numpy()
1.177
  • 稀疏分类交叉熵 [Doc]:
<块引用>

当有两个或多个标签时使用这个交叉熵损失函数 类。我们希望标签以整数形式提供。

>>> y_true = [1, 2]
>>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
>>> # Using 'auto'/'sum_over_batch_size' reduction type.  
>>> scce = tf.keras.losses.SparseCategoricalCrossentropy()
>>> scce(y_true, y_pred).numpy()
1.177

稀疏分类交叉熵的一个很好的例子是 fasion-mnist 数据集。

import tensorflow as tf
from tensorflow import keras

fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()

print(y_train_full.shape) # (60000,)
print(y_train_full.dtype) # uint8

y_train_full[:10]
# array([9, 0, 0, 3, 0, 2, 7, 2, 5, 5], dtype=uint8)

答案 2 :(得分:1)

From the TensorFlow source codesparse_categorical_crossentropy被定义为categorical crossentropy,具有整数目标:

def sparse_categorical_crossentropy(target, output, from_logits=False, axis=-1):
  """Categorical crossentropy with integer targets.
  Arguments:
      target: An integer tensor.
      output: A tensor resulting from a softmax
          (unless `from_logits` is True, in which
          case `output` is expected to be the logits).
      from_logits: Boolean, whether `output` is the
          result of a softmax, or is a tensor of logits.
      axis: Int specifying the channels axis. `axis=-1` corresponds to data
          format `channels_last', and `axis=1` corresponds to data format
          `channels_first`.
  Returns:
      Output tensor.
  Raises:
      ValueError: if `axis` is neither -1 nor one of the axes of `output`.
  """

From the TensorFlow source codecategorical_crossentropy定义为输出张量和目标张量之间的分类交叉熵。

def categorical_crossentropy(target, output, from_logits=False, axis=-1):
  """Categorical crossentropy between an output tensor and a target tensor.
  Arguments:
      target: A tensor of the same shape as `output`.
      output: A tensor resulting from a softmax
          (unless `from_logits` is True, in which
          case `output` is expected to be the logits).
      from_logits: Boolean, whether `output` is the
          result of a softmax, or is a tensor of logits.
      axis: Int specifying the channels axis. `axis=-1` corresponds to data
          format `channels_last', and `axis=1` corresponds to data format
          `channels_first`.
  Returns:
      Output tensor.
  Raises:
      ValueError: if `axis` is neither -1 nor one of the axes of `output`.
  """

整数目标的含义是目标标签应采用显示类索引的整数列表形式,例如:

  • 对于sparse_categorical_crossentropy,对于1类和2类目标,在5类分类问题中,列表应为[1,2]。基本上,目标应为整数形式才能调用sparse_categorical_crossentropy。之所以称为稀疏,是因为目标表示所需要的空间比单热编码少得多。例如,具有b个目标和k个类的批处理需要b * k空间来一次性表示,而具有b个目标和k的批处理类需要b空间以整数形式表示。

  • 对于categorical_crossentropy,对于1类和2类目标,在5类分类问题中,列表应为[[0,1,0,0,0], [0,0,1,0,0]]。基本上,目标应该是一站式形式,以便调用categorical_crossentropy

目标的表示形式是唯一的区别,结果应该相同,因为它们都在计算分类交叉熵。