keras.metrics.Accuracy() 和“准确度”之间的区别

Posted

技术标签:

【中文标题】keras.metrics.Accuracy() 和“准确度”之间的区别【英文标题】:Difference between keras.metrics.Accuracy() and "accuracy" 【发布时间】:2020-11-26 13:50:28 【问题描述】:

我一直在测试构建 nn 模型(tensorflow、keras)的不同方法,我发现在编译模型期间度量标准有些奇怪。

我检查了两种方法:

    model.compile(
        loss=keras.losses.CategoricalCrossentropy(),
        optimizer=keras.optimizers.Adam(),
        metrics=keras.metrics.Accuracy()
    )

    model.compile(
        loss=keras.losses.CategoricalCrossentropy(),
        optimizer=keras.optimizers.Adam(),
        metrics=["accuracy"]
    )

第一种方法的结果:

    Epoch 1/2
    1875/1875 - 2s - loss: 0.0494 - accuracy: 0.0020
    Epoch 2/2
    1875/1875 - 2s - loss: 0.0401 - accuracy: 0.0030

    <tensorflow.python.keras.callbacks.History at 0x7f9c00bc06d8>

第二种方法的结果:

    Epoch 1/2
    1875/1875 - 2s - loss: 0.0368 - accuracy: 0.9884
    Epoch 2/2
    1875/1875 - 2s - loss: 0.0303 - accuracy: 0.9913

    <tensorflow.python.keras.callbacks.History at 0x7f9bfd7d35c0>

这很奇怪,我以为“准确度”与keras.metrics.Accuracy()完全一样。 至少在参数“损失”和“优化器”中是这种情况,例如“adam”与 keras.optimizers.Adam() 相同。 有谁知道为什么这很奇怪或者我错过了什么?

编辑:

在 [] 中使用度量的方法也会产生奇怪的结果:

    model.compile(
        loss=keras.losses.CategoricalCrossentropy(),
        optimizer=keras.optimizers.Adam(),
        metrics=[keras.metrics.Accuracy()]
    )

    Epoch 1/2
    1875/1875 - 2s - loss: 0.2996 - accuracy: 0.0000e+00
    Epoch 2/2
    1875/1875 - 2s - loss: 0.1431 - accuracy: 1.8333e-05

    <tensorflow.python.keras.callbacks.History at 0x7f9bfd1045f8>

【问题讨论】:

试试metrics=[keras.metrics.categorical_accuracy] 【参考方案1】:

当您提到 keras.metrics.Accuracy() 时,您明确要求库计算指标 Accuracy,这是在有多少目标值与预测值匹配之间进行简单比较。

但是,当您提到字符串 accuracy 时,根据您选择的损失类型,会选择不同的 Metric。这是Keras的文档中提到的,

When you pass the strings 'accuracy' or 'acc', we convert this to one of tf.keras.metrics.BinaryAccuracy, tf.keras.metrics.CategoricalAccuracy, tf.keras.metrics.SparseCategoricalAccuracy based on the loss function used and the model output shape. We do a similar conversion for the strings 'crossentropy' and 'ce' as well.

因此,因为CategoricalCrossEntropy 是损失,所以CategoricalAccuracy 在情况2 中计算。这是基于找到argmax 然后比较one-hot 编码。因此,您会在案例 2 中看到更好的准确度值,而在案例 1 中则非常糟糕。

所以字符串accuracy 并不总是意味着度量函数Accuracy()

不同指标的解释供参考,https://keras.io/api/metrics/accuracy_metrics/

论据metrics的解释供参考, https://www.tensorflow.org/api_docs/python/tf/keras/Model#compile

【讨论】:

【参考方案2】:

这是因为您必须将指标指定到列表中。试试这个:

model.compile(
        loss=keras.losses.CategoricalCrossentropy(),
        optimizer=keras.optimizers.Adam(),
        metrics=[keras.metrics.Accuracy()]
    )

你应该得到相同的结果。

编辑:

keras.metrics.Accuracy() 计算预测的相等性与基本事实(see doc) 之间的准确度。在您的情况下,您想计算正确类中 ma​​tch 的准确性。所以你应该根据你的问题使用keras.metrics.BinaryAccuracy()keras.metrics.CategroicalAccuracy()

【讨论】:

我也是这么想的,但这并没有解决问题——我编辑了我的帖子 确实,我检查了文档并 Accuracy() 计算了标签和 pred 相等的次数(不是匹配,而是相同的值)所以准确度几乎等于 0。所以,如果你想要计算与标签正确匹配的准确性,您应该尝试 BinaryAccuracy()(或 Categorical Accuracy())。我编辑我的答案。

以上是关于keras.metrics.Accuracy() 和“准确度”之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

keras.metrics.Accuracy() 和“准确度”之间的区别

tensorflow 测量工具,与自定义训练

从真实值和预测值中获取准确性