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)
我的目的是检查结果accuracy并binary_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行为不同
| 归档时间: |
|
| 查看次数: |
10271 次 |
| 最近记录: |