Solución:
Simplemente:
-
categorical_crossentropy
(cce
) produce una matriz one-hot que contiene la coincidencia probable para cada categoría, -
sparse_categorical_crossentropy
(scce
) produce un índice de categoría del más probable categoría coincidente.
Considere un problema de clasificación con 5 categorías (o clases).
-
En el caso de
cce
, el objetivo único puede ser[0, 1, 0, 0, 0]
y el modelo puede predecir[.2, .5, .1, .1, .1]
(probablemente correcto) -
En el caso de
scce
, el índice objetivo puede ser [1] y el modelo puede predecir: [.5].
Considere ahora un problema de clasificación con 3 clases.
- En el caso de
cce
, el objetivo único podría ser[0, 0, 1]
y el modelo puede predecir[.5, .1, .4]
(probablemente inexacto, dado que le da más probabilidad a la primera clase) - En el caso de
scce
, el índice de destino podría ser[0]
y el modelo puede predecir[.5]
Muchos modelos categóricos producen scce
salida porque ahorra espacio, pero pierde MUCHA información (por ejemplo, en el segundo ejemplo, el índice 2 también estaba muy cerca). cce
salida para la confiabilidad del modelo.
Hay una serie de situaciones para usar scce
, incluyendo:
- cuando sus clases son mutuamente excluyentes, es decir, no le importan en absoluto otras predicciones lo suficientemente cercanas,
- el número de categorías es grande y la salida de la predicción se vuelve abrumadora.
Del código fuente de TensorFlow, el sparse_categorical_crossentropy
Se define como categorical crossentropy
con objetivos enteros:
def sparse_categorical_crossentropy(target, output, from_logits=False, axis=-1):
"""Categorical crossentropy with integer targets.
Arguments:
target: An integer tensor.
output: A tensor resulting from a softmax
(unless `from_logits` is True, in which
case `output` is expected to be the logits).
from_logits: Boolean, whether `output` is the
result of a softmax, or is a tensor of logits.
axis: Int specifying the channels axis. `axis=-1` corresponds to data
format `channels_last', and `axis=1` corresponds to data format
`channels_first`.
Returns:
Output tensor.
Raises:
ValueError: if `axis` is neither -1 nor one of the axes of `output`.
"""
Del código fuente de TensorFlow, el categorical_crossentropy
se define como una entropía cruzada categórica entre un tensor de salida y un tensor de destino.
def categorical_crossentropy(target, output, from_logits=False, axis=-1):
"""Categorical crossentropy between an output tensor and a target tensor.
Arguments:
target: A tensor of the same shape as `output`.
output: A tensor resulting from a softmax
(unless `from_logits` is True, in which
case `output` is expected to be the logits).
from_logits: Boolean, whether `output` is the
result of a softmax, or is a tensor of logits.
axis: Int specifying the channels axis. `axis=-1` corresponds to data
format `channels_last', and `axis=1` corresponds to data format
`channels_first`.
Returns:
Output tensor.
Raises:
ValueError: if `axis` is neither -1 nor one of the axes of `output`.
"""
El significado de los destinos enteros es que las etiquetas de destino deben tener la forma de una lista de enteros que muestre el índice de la clase, por ejemplo:
-
Para
sparse_categorical_crossentropy
, Para objetivos de clase 1 y clase 2, en un problema de clasificación de 5 clases, la lista debe ser [1,2]. Básicamente, los destinos deben estar en forma de número entero para poder llamarsparse_categorical_crossentropy
. Esto se denomina disperso porque la representación de destino requiere mucho menos espacio que la codificación one-hot. Por ejemplo, un lote conb
objetivos yk
necesidades de clasesb * k
espacio para ser representado en one-hot, mientras que un lote conb
objetivos yk
necesidades de clasesb
espacio a representar en forma de número entero. -
Para
categorical_crossentropy
, para objetivos de clase 1 y clase 2, en un problema de clasificación de 5 clases, la lista debe ser[[0,1,0,0,0], [0,0,1,0,0]]
. Básicamente, los objetivos deben estar en forma one-hot para poder llamarcategorical_crossentropy
.
La representación de los objetivos es la única diferencia, los resultados deben ser los mismos ya que ambos están calculando la entropía cruzada categórica.