Spentralisation_crossentropie catégorique vs catégorique_crossentropie (keras, précision)

20

Quel est le meilleur pour la précision ou sont-ils les mêmes? Bien sûr, si vous utilisez categorical_crossentropy vous utilisez un encodage à chaud, et si vous utilisez sparse_categorical_crossentropy vous encodez comme des entiers normaux. De plus, quand est-ce que l'un est meilleur que l'autre?

Master M
la source

Réponses:

26

Utilisez une entropie croisée catégorique clairsemée lorsque vos classes s'excluent mutuellement (par exemple, lorsque chaque échantillon appartient exactement à une classe) et une entropopie catégorique lorsqu'un échantillon peut avoir plusieurs classes ou étiquettes sont des probabilités douces (comme [0,5, 0,3, 0,2]).

La formule de l'interentropie catégorielle (S - échantillons, C - sans classe, sc - l'échantillon appartient à la classe c) est:

1NsScC1sclogp(sc)

Dans le cas où les classes sont exclusives, vous n'avez pas besoin de les additionner - pour chaque échantillon, seule la valeur non nulle est juste logp(sc) pour la vraie classe c.

Cela permet de conserver du temps et de la mémoire. Considérons le cas de 10000 classes lorsqu'elles s'excluent mutuellement - juste 1 journal au lieu de résumer 10000 pour chaque échantillon, un seul entier au lieu de 10000 flottants.

La formule est la même dans les deux cas, donc aucun impact sur la précision ne devrait être présent.

frenzykryger
la source
1
Ont-ils un impact différent sur la précision, par exemple sur l'ensemble de données à chiffres mnist?
Master M
1
Mathématiquement, il n'y a pas de différence. S'il y a une différence significative dans les valeurs calculées par les implémentations (disons tensorflow ou pytorch), cela ressemble à un bug. Une simple comparaison sur des données aléatoires (1000 classes, 10 000 échantillons) ne montre aucune différence.
frenzykryger
Tu as raison. Merci!
frenzykryger
@frenzykryger Je travaille sur un problème multi-sorties. J'ai 3 sorties séparées o1,o2,o3et chacune a des 167,11,7classes respectivement. J'ai lu votre réponse que cela ne fera aucune différence, mais y a-t-il une différence si j'utilise sparse__ou non. Puis-je aller pour categoricalles 2 derniers et sparsepour le premier car il y a 167 classes dans la première classe?
Deshwal
5

La réponse, en bref

Si vos cibles sont codées à chaud, utilisez categorical_crossentropy. Exemples d'encodages à chaud:

[1,0,0]
[0,1,0] 
[0,0,1]

Mais si vos cibles sont des entiers, utilisez sparse_categorical_crossentropy. Exemples de codages entiers (par souci de complétion):

1
2
3
user78035
la source
Ai-je besoin d'un seul nœud de sortie pour sparse_categorical_crossentropy? Et que signifie l' from_logitsargument?
Leevo