Sparse_categorical_crossentropy vs categorical_crossentropy (Keras, Genauigkeit)
19
Was ist besser für die Genauigkeit oder sind sie gleich? Wenn Sie categorical_crossentropy verwenden, verwenden Sie natürlich eine heiße Codierung, und wenn Sie sparse_categorical_crossentropy verwenden, codieren Sie als normale Ganzzahlen. Und wann ist einer besser als der andere?
Verwenden Sie sparsame kategoriale Crossentropie, wenn sich Ihre Klassen gegenseitig ausschließen (z. B. wenn jede Stichprobe genau zu einer Klasse gehört), und kategoriale Crossentropie, wenn eine Stichprobe mehrere Klassen haben kann oder Beschriftungen weiche Wahrscheinlichkeiten sind (wie [0,5, 0,3, 0,2]).
Die Formel für die kategoriale Crossentropie (S - Stichproben, C - Klasse, - Stichprobe gehört zur Klasse c) lautet:s ∈ c
- 1N∑s ∈ S∑c ∈ C1s ∈ cl o gp ( s ∈ c)
Für den Fall, dass Klassen exklusiv sind, müssen Sie keine Summe über sie - für jede Stichprobe ist nur der Wert ungleich Null für die wahre Klasse c.- l o gp ( s ∈ c )
Dies spart Zeit und Speicher. Betrachten Sie den Fall von 10000 Klassen, wenn sie sich gegenseitig ausschließen - nur 1 Protokoll statt 10000 für jede Stichprobe zu summieren, nur eine ganze Zahl statt 10000 Gleitkommazahlen.
Die Formel ist in beiden Fällen gleich, daher sollte die Genauigkeit nicht beeinträchtigt werden.
Beeinflussen sie die Genauigkeit unterschiedlich, z. B. bei einem Datensatz mit mehreren Ziffern?
Master M
1
Mathematisch gibt es keinen Unterschied. Wenn es signifikante Unterschiede in den durch Implementierungen berechneten Werten gibt (z. B. Tensorflow oder Pytorch), klingt dies wie ein Fehler. Ein einfacher Vergleich mit Zufallsdaten (1000 Klassen, 10 000 Stichproben) zeigt keinen Unterschied.
Frenzykryger
Lieber frenzykryger, ich denke, Sie haben ein Minus nur für den Fall einer Stichprobe vergessen: "für jede Stichprobe ist nur ein Wert ungleich Null -log (p (s ∈ c))". Im Übrigen nette Antwort.
Nicg
Du hast recht. Vielen Dank!
Frenzykryger
@frenzykryger Ich arbeite an einem Problem mit mehreren Ausgängen. Ich habe 3 separate Ausgängeo1,o2,o3 und jede hat eine 167,11,7Klasse. Ich habe deine Antwort gelesen, dass es keinen Unterschied macht, aber gibt es einen Unterschied, ob ich benutze sparse__oder nicht. Kann ich categoricalfür die letzten 2 und sparsefür die ersten gehen, da es 167 Klassen in der ersten Klasse gibt?
Deshwal
4
Die Antwort auf den Punkt gebracht
Wenn Ihre Ziele One-Hot-codiert sind, verwenden Sie categorical_crossentropy. Beispiele für One-Hot-Codierungen:
[1,0,0][0,1,0][0,0,1]
Wenn Ihre Ziele jedoch Ganzzahlen sind, verwenden Sie sparse_categorical_crossentropy. Beispiele für Integer-Codierungen (zur Vervollständigung):
o1,o2,o3
und jede hat eine167,11,7
Klasse. Ich habe deine Antwort gelesen, dass es keinen Unterschied macht, aber gibt es einen Unterschied, ob ich benutzesparse__
oder nicht. Kann ichcategorical
für die letzten 2 undsparse
für die ersten gehen, da es 167 Klassen in der ersten Klasse gibt?Die Antwort auf den Punkt gebracht
Wenn Ihre Ziele One-Hot-codiert sind, verwenden Sie categorical_crossentropy. Beispiele für One-Hot-Codierungen:
Wenn Ihre Ziele jedoch Ganzzahlen sind, verwenden Sie sparse_categorical_crossentropy. Beispiele für Integer-Codierungen (zur Vervollständigung):
quelle
sparse_categorical_crossentropy
? Und was bedeutet dasfrom_logits
Argument?