Keras二进制精度度量标准提供了太高的精度

Nin*_*nja 4 classification machine-learning keras tensorflow multiclass-classification

我正在研究使用Keras的多类分类问题,我使用二进制精度和分类精度作为指标.当我评估我的模型时,我得到了一个非常高的二进制精度值和非常低的分类精度.我试图在我自己的代码中重新创建二进制精度指标,但我没有太多运气.我的理解是,这是我需要重新创建的过程:

def binary_accuracy(y_true, y_pred):
     return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

from keras import backend as K
preds = model.predict(X_test, batch_size = 128)

print preds
pos = 0.00
neg = 0.00

for i, val in enumerate(roundpreds):

    if val.tolist() == y_test[i]:
        pos += 1.0

    else: 
        neg += 1.0

print pos/(pos + neg)
Run Code Online (Sandbox Code Playgroud)

但这比二进制精度给出的值低得多.二进制精度甚至是在多类问题中使用的适当度量吗?若有,那么有谁知道我哪里出错了?

Mar*_*jko 14

因此,您需要了解在应用binary_crossentropy多类预测时会发生什么.

  1. 让我们假设您的输出softmax(0.1, 0.2, 0.3, 0.4)和一个热编码的基础事实(1, 0, 0, 0).
  2. binary_crossentropy屏蔽所有高于0.5网络的输出转向(0, 0, 0, 0)矢量.
  3. (0, 0, 0, 0)匹配地面实况(1, 0, 0, 0)的4个分之3的指标-这使得产生的准确性是在水平75%完全错误的答案!

要解决这个问题,你可以使用单一的类精度,例如:

def single_class_accuracy(interesting_class_id):
    def fn(y_true, y_pred):
        class_id_preds = K.argmax(y_pred, axis=-1)
        # Replace class_id_preds with class_id_true for recall here
        positive_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32')
        true_mask = K.cast(K.equal(y_true, interesting_class_id), 'int32')
        acc_mask = K.cast(K.equal(positive_mask, true_mask), 'float32')
        class_acc = K.mean(acc_mask)
        return class_acc

    return fn
Run Code Online (Sandbox Code Playgroud)