为什么keras中的accuracy和binary_accuracy有相同的结果?

Tav*_*oli 10 classification keras tensorflow

我使用 Keras 创建了一个简单的二元分类模型。代码是:

    # create model
    model = Sequential()
    model.add(Dense(250, input_dim=1, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', 'binary_accuracy'])
Run Code Online (Sandbox Code Playgroud)

我的目的是检查结果accuracybinary_accuracy了解它们之间的区别。

正如 Keras 所说,binary_accuracy准确度有默认阈值.5,而“准确度”则没有。当我用样本数据测试它们时,结果是不同的,但在模型训练中,每个时期都有相同的结果。

对于这个真实的和预测的样本,我测试了accuracy并且binary_accuracy

   y_true = [[1], [1], [0], [0]]
   y_pred = [[0.51], [1], [0], [0.4]]
Run Code Online (Sandbox Code Playgroud)

对于 binary_accuracy是:

m = tf.keras.metrics.BinaryAccuracy()
m.update_state(y_true, y_pred)
m.result().numpy()
Run Code Online (Sandbox Code Playgroud)

结果是: 1

对于 accuracy是:

m = tf.keras.metrics.Accuracy()
m.update_state(y_true, y_pred)
m.result().numpy()
Run Code Online (Sandbox Code Playgroud)

结果是:'.5'

但在上面的模型中,每个时期的每个人都是相同的。

编辑

通过将编译更改为这样,结果发生了变化:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', tf.keras.metrics.BinaryAccuracy(threshold=.7)])
Run Code Online (Sandbox Code Playgroud)

为什么在模型内accuracy工作而不是在模型外工作?binary_accuracythreshold=0.5

Pro*_*oko 17

根据tf.keras.Model.compile()文档:

当您传递字符串“accuracy”或“acc”时,我们根据所使用的损失函数和模型输出形状。我们也对字符串“crossentropy”和“ce”进行类似的转换。

在您的情况下,它已转换为 BinaryAccuracy,因此结果是相同的。

然而却tf.keras.metrics.Accuracy是完全不同的东西。如果您阅读了文档:

计算预测等于标签的频率。

这意味着它会查看y_pred和的独特值y_true,并将每个独特值视为不同的标签。在您的情况下,0.51 和 0.4 被视为单独的标签,因为它们分别不等于 1 和 0,所以您得到 0.5

抱歉首先将此问题标记为重复,该行为与tf.keras包中的keras行为不同