我用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'])
我的目的是检查accuracy
和binary_accuracy
的结果是否理解他们之间的差异。
正如Keras说的,binary_accuracy
精度有一个阈值,缺省值是.5
,而‘精度’没有。当我用样本数据测试它们时,结果是不同的,但是在模型的过程中,您在每个时代都有相同的结果。
对于这个真实和预测的样本,我测试了accuracy
和binary_accuracy
y_true = [[1], [1], [0], [0]]
y_pred = [[0.51], [1], [0], [0.4]]
对于binary_accuracy
是:
m = tf.keras.metrics.BinaryAccuracy()
m.update_state(y_true, y_pred)
m.result().numpy()
结果是:1
对于accuracy
是:
m = tf.keras.metrics.Accuracy()
m.update_state(y_true, y_pred)
m.result().numpy()
结果是:“.5”
但在上述模型中,每个时代的情况都是相同的。
编辑
通过将编译更改为此,结果更改如下:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', tf.keras.metrics.BinaryAccuracy(threshold=.7)])
为什么accuracy
在模型中像binary_accuracy
一样使用threshold=0.5
,而在模型之外却不像threshold=0.5
?
发布于 2020-12-18 17:52:53
根据tf.keras.Model.compile()
文档:
在传递字符串“精度”或“acc”时,根据所使用的损失函数和模型输出形状,将其转换为tf.keras.metrics.BinaryAccuracy、tf.keras.metrics.CategoricalAccuracy、tf.keras.metrics.SparseCategoricalAccuracy中的一个。我们也对字符串‘交叉熵’和'ce‘进行了类似的转换。
在您的示例中,它被转换为BinaryAccuracy,因此结果是相同的。
然而,tf.keras.metrics.Accuracy
是完全不同的东西。如果您阅读了这些文档:
计算预测等于标签的频率。
这意味着它会查看y_pred
和y_true
的唯一值,并将每个唯一的值作为一个不同的标签对待。在您的示例中,0.51和0.4被视为单独的标签,因为它们分别不等于1和0,因此得到0.5
很抱歉,最初将此问题标记为重复,tf.keras
中的行为与keras
包中的行为不同。
https://stackoverflow.com/questions/65361359
复制相似问题