Keras - Difference between categorical_accuracy and sparse_categorical_accuracy
The sparse_categorical_accuracy
expects sparse targets:
[[0], [1], [2]]
For instance:
import tensorflow as tf
sparse = [[0], [1], [2]]
logits = [[.8, .1, .1], [.5, .3, .2], [.2, .2, .6]]
sparse_cat_acc = tf.metrics.SparseCategoricalAccuracy()
sparse_cat_acc(sparse, logits)
<tf.Tensor: shape=(), dtype=float64, numpy=0.6666666666666666>
categorical_accuracy
expects one hot encoded targets:
[[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]
For instance:
onehot = [[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]
logits = [[.8, .1, .1], [.5, .3, .2], [.2, .2, .6]]
cat_acc = tf.metrics.CategoricalAccuracy()
cat_acc(sparse, logits)
<tf.Tensor: shape=(), dtype=float64, numpy=0.6666666666666666>
Looking at the source
def categorical_accuracy(y_true, y_pred):
return K.cast(K.equal(K.argmax(y_true, axis=-1),
K.argmax(y_pred, axis=-1)),
K.floatx())
def sparse_categorical_accuracy(y_true, y_pred):
return K.cast(K.equal(K.max(y_true, axis=-1),
K.cast(K.argmax(y_pred, axis=-1), K.floatx())),
K.floatx())
categorical_accuracy
checks to see if the index of the maximal true value is equal to the index of the maximal predicted value.
sparse_categorical_accuracy
checks to see if the maximal true value is equal to the index of the maximal predicted value.
From Marcin's answer above the categorical_accuracy
corresponds to a one-hot
encoded vector for y_true
.
So in categorical_accuracy
you need to specify your target (y
) as one-hot encoded vector (e.g. in case of 3 classes, when a true class is second class, y
should be (0, 1, 0)
. In sparse_categorical_accuracy
you need should only provide an integer of the true class (in the case from previous example - it would be 1
as classes indexing is 0
-based).