我一直在使用Keras进行二分类,采用Python中的Tensorflow后端。我的模型是这样的创建的:
model = Sequential()model.add(Dense(1000, input_dim=168319))model.add(Dense(units=1, activation='sigmoid'))model.compile(loss="binary_crossentropy", optimizer="adam", metrics=['accuracy'])
训练后的结果看起来像这样:
342/1342 [==============================] - 79s 59ms/step - loss: 0.0586 - acc: 0.9911 - val_loss: 0.4632 - val_acc: 0.8169
如果我使用我的网络来预测一个样本,它会给我一个在[0,1]之间的数,这也是应该的,因为我对输出神经元使用了sigmoid激活函数。我的输出在预测6个应该属于类别1的样本后的一个例子看起来像这样:
[[1. ][1. ][0.99997437][0.18694757][0.18712251][0.9491884 ]]
由于结果都是0到1之间的浮点数,我一直在想Keras是如何计算验证准确率的。验证准确率是用未用于训练的测试样本来测量的。如这里所提到的Keras如何计算验证准确率和训练准确率?,验证准确率是通过(正确猜测的数量)/(总猜测数量)
计算的。
我的问题是,Keras如何决定猜测属于哪个类别,何时被认为是“正确”的。它是在0.5时向上取整吗?还是0到1之间的一切都被分类为“错误的猜测”(那么我期望验证准确率的数字会低得多)?
回答:
由于你使用的是binary_crossentropy
,在这种情况下,你的六个类别是分别评估的。对于每个类别,大于0.5的值被设为1,小于0.5的值被设为0。如果你使用的是categorical_crossentropy
,那么只有一个类别可以是1。哪个类别的概率最高就会被设为1,其余的将被设为0。如果你仔细想想,binary
情况只是categorical
情况的一个特殊情况。最高值被设为1。因此,只有当预测值大于0.5时,预测值才被设为1。
更多信息,请查看binary_accuracy
,在github.com/keras-team/keras/blob/master/keras/metrics.py中。