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 ?
Réponses
Trop de publicités?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.
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)
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 appelersparse_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 avecb
les cibles etk
besoins des classesb * k
à représenter en un seul coup, alors qu'un lot avec desb
les cibles etk
besoins des classesb
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'appelercategorical_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.
2 votes
La principale différence est que votre
targets
. Veuillez consulter ce post. jovianlin.io/cat-crossentropy-vs-sparse-cat-crossentropy0 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.
2 votes
Le lien de jovianlin.io ne fonctionne pas