Sparse_categorical_crossentropy vs categorical_crossentropy (keras, precisão)
20
Qual é melhor para precisão ou são iguais? Obviamente, se você usar categorical_crossentropy, usará uma codificação quente e se sparse_categorical_crossentropy, codificará como números inteiros normais. Além disso, quando um é melhor que o outro?
Use a entropia cruzada categórica esparsa quando suas classes forem mutuamente exclusivas (por exemplo, quando cada amostra pertence exatamente a uma classe) e a entropia cruzada categórica quando uma amostra pode ter várias classes ou os rótulos são probabilidades brandas (como [0,5, 0,3, 0,2]).
A fórmula para a entropia cruzada categórica (S - amostras, C - sem classe, - a amostra pertence à classe c) é:s ∈ c
- 1N∑s ∈ S∑c ∈ C1s ∈ cl o gp ( s ∈ c )
No caso em que as classes são exclusivas, você não precisa somar sobre elas - para cada amostra apenas o valor diferente de zero é apenas para a verdadeira classe c.- l o gp( s ∈ c )
Isso permite economizar tempo e memória. Considere o caso de 10000 classes quando elas são mutuamente exclusivas - apenas 1 log em vez de resumir 10000 para cada amostra, apenas um número inteiro em vez de 10000 flutuadores.
A fórmula é a mesma nos dois casos, portanto, não há impacto na precisão.
Eles afetam a precisão de maneira diferente, por exemplo, no conjunto de dados de dígitos mnist?
Master M
1
Matematicamente, não há diferença. Se houver uma diferença significativa nos valores calculados pelas implementações (digamos tensorflow ou pytorch), isso soa como um bug. A comparação simples em dados aleatórios (1000 classes, 10.000 amostras) não mostra diferença.
Frenzykryger
∈
Você está certo. Obrigado!
Frenzykryger 14/09/19
@frenzykryger Estou trabalhando no problema de várias saídas. Eu tenho 3 saídas separadas o1,o2,o3e cada um tem 167,11,7classes, respectivamente. Eu li sua resposta de que não fará diferença, mas existe alguma diferença se eu usar sparse__ou não. Posso ir para categoricalas duas últimas e sparsepara a primeira, pois existem 167 aulas na primeira aula?
Deshwal
5
A resposta, em poucas palavras
Se seus destinos forem codificados com um hot hot, use categorical_crossentropy. Exemplos de codificações one-hot:
[1,0,0][0,1,0][0,0,1]
Mas se seus destinos forem números inteiros, use sparse_categorical_crossentropy. Exemplos de codificações inteiras (para fins de conclusão):
o1,o2,o3
e cada um tem167,11,7
classes, respectivamente. Eu li sua resposta de que não fará diferença, mas existe alguma diferença se eu usarsparse__
ou não. Posso ir paracategorical
as duas últimas esparse
para a primeira, pois existem 167 aulas na primeira aula?A resposta, em poucas palavras
Se seus destinos forem codificados com um hot hot, use categorical_crossentropy. Exemplos de codificações one-hot:
Mas se seus destinos forem números inteiros, use sparse_categorical_crossentropy. Exemplos de codificações inteiras (para fins de conclusão):
fonte
sparse_categorical_crossentropy
? E o que ofrom_logits
argumento significa?