如何在Keras中定义自定义精度以忽略具有特定金标的样本?

时间:2017-11-13 18:02:23

标签: tensorflow keras metrics

我想在Keras中写一个等效于categorical_accuracy的自定义指标(我使用张量流后端),但是具有特定黄金标签的样本(在我的情况下为0,来自y_true)的输出必须被忽略了。例如,如果我的输出是:

Pred 1 - Gold 0

Pred 1 - Gold 1

精度为1,因为必须忽略带有金标号0的样品。也就是说,我写的功能(并没有给出预期的结果)是:

def my_accuracy(y_true, y_pred):

    mask = K.any(K.not_equal(K.argmax(y_true, axis=-1), 0), axis=-1, keepdims=True)

    masked_y_true = y_true*K.cast(mask, K.dtype(y_true))
    masked_y_pred = y_pred*K.cast(mask, K.dtype(y_pred))

    return keras.metrics.categorical_accuracy(masked_y_true, masked_y_pred)`

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试这种方法:

def ignore_accuracy_of_class(class_to_ignore=0):
    def ignore_acc(y_true, y_pred):
        y_true_class = K.argmax(y_true, axis=-1)
        y_pred_class = K.argmax(y_pred, axis=-1)

        ignore_mask = K.cast(K.not_equal(y_pred_class, class_to_ignore), 'int32')
        matches = K.cast(K.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
        accuracy = K.sum(matches) / K.maximum(K.sum(ignore_mask), 1)
        return accuracy

    return ignore_acc

答案 1 :(得分:0)

根据@RKO的回复,这是TensorFlow 2.0版本

import tensorflow.keras as K
def ignore_acc(y_true_class, y_pred_class, class_to_ignore=0):
    ignore_mask = K.backend.cast(K.backend.not_equal(y_pred_class, class_to_ignore), 'int32')
    matches = K.backend.cast(K.backend.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
    accuracy = K.backend.sum(matches) / K.backend.maximum(K.backend.sum(ignore_mask), 1)
    return accuracy.numpy()