keras.metrics.Accuracy()和"accuracy"之间的区别是什么?

15

我一直在测试使用不同方法来建立神经网络模型(使用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>

这很奇怪,我以为“accuracy”和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>


1
尝试使用 metrics=[keras.metrics.categorical_accuracy] - Nicolas Gervais
2个回答

17
当您提到keras.metrics.Accuracy()时,您明确要求库计算度量Accuracy,这是目标值与预测值匹配的简单比较。
然而,当您提到字符串accuracy时,根据所选择的损失类型,会选择不同的Metric。这是在Keras文档中提到的,
当您传递字符串'accuracy'或'acc'时,我们将其转换为tf.keras.metrics.BinaryAccuracy、tf.keras.metrics.CategoricalAccuracy、tf.keras.metrics.SparseCategoricalAccuracy之一,基于所使用的损失函数和模型输出形状。对于字符串'crossentropy'和'ce',我们也进行类似的转换。
因此,在情况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

0

这是因为你需要将指标指定为一个列表。尝试这样做:

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

你应该得到相同的结果。

编辑:

keras.metrics.Accuracy() 计算预测值和真实值 (请参阅文档)相等性之间的准确度。在你的情况下,你想计算正确类别中的匹配准确度。因此,根据你的问题,你应该使用 keras.metrics.BinaryAccuracy()keras.metrics.CategroicalAccuracy()


我也这么想,但它并不能解决问题 - 我已经编辑了我的帖子。 - Pav3k
实际上,我查看了文档并发现Accuracy()函数计算标签和预测值相等的次数(不是匹配,而是相同的值),因此准确率几乎等于0。所以,如果你想要计算正确匹配标签的准确率,你应该尝试使用BinaryAccuracy()函数(或Categorical Accuracy()函数)。我已经编辑了我的回答。 - B Douchet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接