Sparse_categorical_crossentropy vs categorical_crossentropy (keras, accuratezza)


20

Qual è la migliore per la precisione o sono uguali? Ovviamente, se usi categorical_crossentropy usi una codifica a caldo, e se usi sparse_categorical_crossentropy codifichi come interi normali. Inoltre, quando uno è migliore dell'altro?

Risposte:


26

Usa la crossentropia categorica sparsa quando le tue classi si escludono a vicenda (ad esempio quando ogni campione appartiene esattamente a una classe) e la crossentropia categorica quando un campione può avere più classi o le etichette sono probabilità morbide (come [0,5, 0,3, 0,2]).

La formula per la crossentropia categorica (S - campioni, C - classe, Sc - campione appartiene alla classe c) è:

-1NΣSSΣcC1Sclogp(Sc)

Nel caso in cui le classi siano esclusive, non è necessario sommarle - per ogni campione solo un valore diverso da zero è solo -logp(Sc) per la vera classe c.

Ciò consente di risparmiare tempo e memoria. Prendi in considerazione il caso di 10000 classi quando si escludono a vicenda - solo 1 log invece di sommare 10000 per ogni campione, solo un numero intero anziché 10000 float.

La formula è la stessa in entrambi i casi, quindi non dovrebbe esserci alcun impatto sull'accuratezza.


1
Hanno un impatto diverso sull'accuratezza, ad esempio sul set di dati delle cifre di mnist?
Master M

1
Matematicamente non c'è differenza. Se c'è una differenza significativa nei valori calcolati dalle implementazioni (diciamo tensorflow o pytorch), allora questo sembra un bug. Il semplice confronto su dati casuali (1000 classi, 10 000 campioni) non mostra alcuna differenza.
Frenzykryger,


Hai ragione. Grazie!
Frenzykryger,

@frenzykryger Sto lavorando al problema dell'uscita multipla. Ho 3 output separati o1,o2,o3e ognuno ha le 167,11,7classi rispettivamente. Ho letto la tua risposta che non farà alcuna differenza, ma c'è qualche differenza se uso sparse__o meno. Posso andare per categoricalgli ultimi 2 e sparseper il primo in quanto ci sono 167 classi nella prima classe?
Deshwal,

5

La risposta, in breve

Se i tuoi target hanno una codifica a caldo, usa categorical_crossentropy. Esempi di codifiche one-hot:

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

Ma se i tuoi target sono numeri interi, usa sparse_categorical_crossentropy. Esempi di codifiche di numeri interi (per motivi di completamento):

1
2
3

Ho bisogno di un singolo nodo di output per sparse_categorical_crossentropy? E cosa significa l' from_logitsargomento?
Leevo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.