114 votes

Quelle est la différence entre sparse_categorical_crossentropy et categorical_crossentropy ?

Quelle est la différence entre sparse_categorical_crossentropy y categorical_crossentropy ? Quand faut-il utiliser une perte plutôt qu'une autre ? Par exemple, ces pertes sont-elles adaptées à la régression linéaire ?

2 votes

La principale différence est que votre targets . Veuillez consulter ce post. jovianlin.io/cat-crossentropy-vs-sparse-cat-crossentropy

0 votes

@zihaozhihao très bonne et claire explication là. et pouvez-vous répondre à mon autre question mentionnée dans le post .

1 votes

Pour les problèmes de régression linéaire, la perte MSE est généralement utilisée.

94voto

dturvene Points 850

Tout simplement :

  • categorical_crossentropy ( cce ) produit un tableau à un coup contenant la correspondance probable pour chaque catégorie,
  • sparse_categorical_crossentropy ( scce ) produit un indice de catégorie de l le plus probable catégorie correspondante.

Considérons un problème de classification avec 5 catégories (ou classes).

  • Dans le cas de cce la cible unique peut être [0, 1, 0, 0, 0] et le modèle peut prédire [.2, .5, .1, .1, .1] (probablement juste)

  • Dans le cas de scce l'indice cible peut être [1] et le modèle peut prédire : [.5].

Considérons maintenant un problème de classification avec 3 classes.

  • Dans le cas de cce la cible unique pourrait être [0, 0, 1] et le modèle peut prédire [.5, .1, .4] (probablement inexact, étant donné qu'il donne plus de probabilité à la première classe)
  • Dans le cas de scce l'indice cible pourrait être [0] et le modèle peut prédire [.5]

De nombreux modèles catégoriels produisent scce car vous gagnez de l'espace, mais perdez BEAUCOUP d'informations (par exemple, dans le 2ème exemple, l'indice 2 était également très proche). Je préfère en général cce sortie pour la fiabilité du modèle.

Il existe un certain nombre de situations pour utiliser scce y compris :

  • lorsque vos classes sont mutuellement exclusives, c'est-à-dire que vous ne vous souciez pas du tout des autres prédictions suffisamment proches,
  • le nombre de catégories est grand au point que la sortie de prédiction devient écrasante.

72voto

Bitswazsky Points 470

J'étais également confus avec celui-ci. Heureusement, l'excellente documentation de Keras est venue à ma rescousse. Les deux ont la même fonction de perte et font finalement la même chose, la seule différence est dans la représentation des vrais labels.

  • Entropie croisée catégorielle [ Doc ] :

Utilisez cette fonction de perte de l'entropie croisée lorsqu'il y a deux étiquettes ou plus. d'étiquettes. Nous nous attendons à ce que les étiquettes soient fournies dans une représentation unique.

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

  • Entropie croisée catégorielle éparse [ Doc ] :

Utilisez cette fonction de perte d'entropie croisée lorsqu'il y a deux étiquettes ou plus. d'étiquettes. Les étiquettes doivent être fournies sous forme d'entiers.

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

L'ensemble de données fasion-mnist constitue un bon exemple de l'entropie croisée par catégories éparses.

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)

20voto

Cyruseption Points 114

Extrait du code source de TensorFlow le sparse_categorical_crossentropy est défini comme suit categorical crossentropy avec des objectifs entiers :

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`.
  """

Extrait du code source de TensorFlow le categorical_crossentropy est définie comme l'entropie croisée catégorielle entre un tenseur de sortie et un tenseur cible.

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`.
  """

La signification des cibles entières est que les étiquettes des cibles doivent se présenter sous la forme d'une liste d'entiers qui indique l'indice de la classe, par exemple :

  • Pour sparse_categorical_crossentropy Pour les cibles de classe 1 et de classe 2, dans un problème de classification à 5 classes, la liste devrait être [1,2]. Fondamentalement, les cibles doivent être sous forme de nombres entiers afin de pouvoir appeler sparse_categorical_crossentropy . Cette représentation est dite clairsemée car la représentation cible nécessite beaucoup moins d'espace que le codage à un coup. Par exemple, un lot avec b les cibles et k besoins des classes b * k à représenter en un seul coup, alors qu'un lot avec des b les cibles et k besoins des classes b l'espace à représenter sous forme de nombres entiers.

  • Pour categorical_crossentropy pour les cibles de classe 1 et de classe 2, dans un problème de classification à 5 classes, la liste devrait être la suivante [[0,1,0,0,0], [0,0,1,0,0]] . Fondamentalement, les cibles doivent être en un seul coup afin d'appeler categorical_crossentropy .

La représentation des cibles est la seule différence, les résultats devraient être les mêmes puisqu'ils calculent tous deux l'entropie croisée catégorielle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X