Keras - categorical_accuracy和sparse_categorical_accuracy之间的区别

rei*_*eer 33 classification machine-learning neural-network deep-learning keras

categorical_accuracysparse_categorical_accuracyKeras有什么区别?这些指标文档中没有任何提示,并且通过询问谷歌博士,我也没有找到答案.

源代码可以在这里找到:

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())
Run Code Online (Sandbox Code Playgroud)

Mar*_*jko 53

所以在categorical_accuracy你需要指定你的target(y)作为一个热门的编码向量(例如在3个类的情况下,当一个真正的类是第二类时,y应该是(0, 1, 0).在sparse_categorical_accuracy你需要时应该只提供一个真实类的整数(在来自前一个示例的案例 - 它将10基于类的索引编写的.

  • 这对我很有用:) (6认同)
  • @user3303020 当您告诉 keras 使用 `"accuracy"` 时,keras 使用的是默认精度,即 `categorical_accuracy` (6认同)
  • 我的回答有帮助吗? (2认同)
  • @aviv 后续问题 - 这与“准确性”有何不同?谢谢。 (2认同)

Mat*_*yra 30

源头

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())
Run Code Online (Sandbox Code Playgroud)

categorical_accuracy进行检查以查看是否索引的最大真值的等于索引的最大预测值.

sparse_categorical_accuracy检查最大真值是否等于最大预测值的索引.

从Marcin的上面的答案categorical_accuracy对应于one-hot编码的矢量y_true.


Nic*_*ais 11

sparse_categorical_accuracy预计稀疏的目标

[[0], [1], [2]]
Run Code Online (Sandbox Code Playgroud)

例如:

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)
Run Code Online (Sandbox Code Playgroud)
<tf.Tensor: shape=(), dtype=float64, numpy=0.6666666666666666>
Run Code Online (Sandbox Code Playgroud)

categorical_accuracy期望一个热编码目标

[[1., 0., 0.],  [0., 1., 0.], [0., 0., 1.]]
Run Code Online (Sandbox Code Playgroud)

例如:

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)
Run Code Online (Sandbox Code Playgroud)
<tf.Tensor: shape=(), dtype=float64, numpy=0.6666666666666666>
Run Code Online (Sandbox Code Playgroud)