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?
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, s∈c - l'échantillon appartient à la classe c) est:
−1N∑s∈S∑c∈C1s∈clogp(s∈c)
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(s∈c) 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.
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):
o1,o2,o3
et chacune a des167,11,7
classes respectivement. J'ai lu votre réponse que cela ne fera aucune différence, mais y a-t-il une différence si j'utilisesparse__
ou non. Puis-je aller pourcategorical
les 2 derniers etsparse
pour le premier car il y a 167 classes dans la première classe?La réponse, en bref
Si vos cibles sont codées à chaud, utilisez categorical_crossentropy. Exemples d'encodages à chaud:
Mais si vos cibles sont des entiers, utilisez sparse_categorical_crossentropy. Exemples de codages entiers (par souci de complétion):
la source
sparse_categorical_crossentropy
? Et que signifie l'from_logits
argument?