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

Pav*_*v3k 16 python machine-learning deep-learning keras tensorflow

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

我检查了两种方法:

    model.compile(
        loss=keras.losses.CategoricalCrossentropy(),
        optimizer=keras.optimizers.Adam(),
        metrics=keras.metrics.Accuracy()
    )
Run Code Online (Sandbox Code Playgroud)

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

Run Code Online (Sandbox Code Playgroud)

第一种方法的结果:

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

第二种方法的结果:

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

这很奇怪,我认为“准确度”与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>

Run Code Online (Sandbox Code Playgroud)

ran*_*a47 18

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

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

供参考的参数解释metricshttps://www.tensorflow.org/api_docs/python/tf/keras/Model#compile


B D*_*het 0

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

model.compile(
        loss=keras.losses.CategoricalCrossentropy(),
        optimizer=keras.optimizers.Adam(),
        metrics=[keras.metrics.Accuracy()]
    )
Run Code Online (Sandbox Code Playgroud)

你应该得到相同的结果。

编辑 :

keras.metrics.Accuracy()计算预测和真实情况之间的准确性(参见文档)。在您的情况下,您想要计算正确类别中匹配的准确性。所以你应该根据你的问题使用keras.metrics.BinaryAccuracy()或。keras.metrics.CategroicalAccuracy()