首页 > 解决方案 > keras.metrics.Accuracy() 和“准确度”之间的区别

问题描述

我一直在测试构建 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()完全一样。至少在参数“loss”和“optimizer”中是这样的,例如“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>

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


当您提到时,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.

因此,在情况 2 中计算CategoricalCrossEntropy损失也是CategoricalAccuracy如此。这是基于找到 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


推荐阅读