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?

Respostas:


26

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) é:sc

-1NsScC1sceuogp(sc)

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.-euogp(sc)

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.


1
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):

1
2
3

Preciso de um único nó de saída sparse_categorical_crossentropy? E o que o from_logitsargumento significa?
Leevo 15/12/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.