Sparse_categorical_crossentropy vs categorical_crossentropy (keras, precisión)

20

¿Cuál es mejor para la precisión o son iguales? Por supuesto, si usa categorical_crossentropy, usa una codificación activa, y si usa sparse_categorical_crossentropy, codifica como enteros normales. Además, ¿cuándo es uno mejor que el otro?

Maestro m
fuente

Respuestas:

26

Use la entropía categórica escasa cuando sus clases son mutuamente excluyentes (por ejemplo, cuando cada muestra pertenece exactamente a una clase) y la entropía categórica cuando una muestra puede tener múltiples clases o etiquetas son probabilidades blandas (como [0.5, 0.3, 0.2]).

La fórmula para la crossentropía categórica (S - muestras, C - clases, sc - la muestra pertenece a la clase c) es:

1NsScC1sclogp(sc)

Para el caso en que las clases son exclusivas, no es necesario sumarlas: para cada muestra solo el valor distinto de cero es justo logp(sc) para la verdadera clase c.

Esto permite ahorrar tiempo y memoria. Considere el caso de 10000 clases cuando son mutuamente excluyentes: solo 1 registro en lugar de sumar 10000 para cada muestra, solo un número entero en lugar de 10000 flotantes.

La fórmula es la misma en ambos casos, por lo que no debe haber impacto en la precisión.

frenzykryger
fuente
1
¿Impactan la precisión de manera diferente, por ejemplo, en el conjunto de datos de dígitos mnist?
Maestro M
1
Matemáticamente no hay diferencia. Si hay una diferencia significativa en los valores calculados por las implementaciones (por ejemplo, tensorflow o pytorch), entonces esto suena como un error. La comparación simple en datos aleatorios (1000 clases, 10 000 muestras) no muestra diferencias.
frenzykryger
Tienes razón. ¡Gracias!
frenzykryger
@frenzykryger Estoy trabajando en un problema de salida múltiple. Tengo 3 salidas separadas o1,o2,o3y cada una tiene 167,11,7clases respectivamente. He leído su respuesta de que no habrá diferencia, pero ¿hay alguna diferencia si la uso sparse__o no? ¿Puedo ir para categoricallos últimos 2 y sparsepara el primero ya que hay 167 clases en la primera clase?
Deshwal
5

La respuesta, en pocas palabras

Si sus objetivos están codificados en caliente, use categorical_crossentropy. Ejemplos de codificaciones one-hot:

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

Pero si sus objetivos son enteros, use sparse_categorical_crossentropy. Ejemplos de codificaciones de enteros (en aras de la finalización):

1
2
3
usuario78035
fuente
¿Necesito un solo nodo de salida para sparse_categorical_crossentropy? ¿Y qué significa el from_logitsargumento?
Leevo