如何在 Keras 中为张量创建布尔掩码? [英] How do you create a boolean mask for a tensor in Keras?

查看:27
本文介绍了如何在 Keras 中为张量创建布尔掩码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个自定义指标来衡量训练期间我的多类数据集中一个类的准确性.我在选择课程时遇到问题.

I am building a custom metric to measure the accuracy of one class in my multi-class dataset during training. I am having trouble selecting the class.

目标是一个热点(例如:类 0 标签是 [1 0 0 0 0]):

The targets are one hot (e.g: the class 0 label is [1 0 0 0 0]):

from keras import backend as K

def single_class_accuracy(y_true, y_pred):
    idx = bool(y_true[:, 0])              # boolean mask for class 0 
    class_preds = y_pred[idx]
    class_true = y_true[idx]
    class_acc = K.mean(K.equal(K.argmax(class_true, axis=-1), K.argmax(class_preds, axis=-1)))  # multi-class accuracy  
    return class_acc

问题是,我们必须使用 Keras 函数来索引张量.如何为张量创建布尔掩码?

The trouble is, we have to use Keras functions to index tensors. How do you create a boolean mask for a tensor?

推荐答案

请注意,当谈到一个类的准确度时,一个可能指的是以下任一(不等价的)两个数量:

Note that when talking about the accuracy of one class one may refer to either of the following (not equivalent) two amounts:

  • 召回,对于 C 类,是用 C 类标记的被预测为 类的例子的比率>C.
  • 精度,对于 C 类,是预测为 C 类但实际上标记为C 类.
  • The recall, which, for class C, is the ratio of examples labelled with class C that are predicted to have class C.
  • The precision, which, for class C, is the ratio of examples predicted to be of class C that are in fact labelled with class C.

无需进行复杂的索引,您可以仅依靠掩码进行计算.假设我们在这里谈论的是精确度(更改为召回率是微不足道的).

Instead of doing complex indexing, you can just rely on masking for you computation. Assuming we are talking about precision here (changing to recall would be trivial).

from keras import backend as K

INTERESTING_CLASS_ID = 0  # Choose the class of interest

def single_class_accuracy(y_true, y_pred):
    class_id_true = K.argmax(y_true, axis=-1)
    class_id_preds = K.argmax(y_pred, axis=-1)
    # Replace class_id_preds with class_id_true for recall here
    accuracy_mask = K.cast(K.equal(class_id_preds, INTERESTING_CLASS_ID), 'int32')
    class_acc_tensor = K.cast(K.equal(class_id_true, class_id_preds), 'int32') * accuracy_mask
    class_acc = K.sum(class_acc_tensor) / K.maximum(K.sum(accuracy_mask), 1)
    return class_acc

如果你想更灵活,你也可以参数化感兴趣的类:

If you want to be more flexible, you can also have the class of interest parametrised:

from keras import backend as K

def single_class_accuracy(interesting_class_id):
    def fn(y_true, y_pred):
        class_id_true = K.argmax(y_true, axis=-1)
        class_id_preds = K.argmax(y_pred, axis=-1)
        # Replace class_id_preds with class_id_true for recall here
        accuracy_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32')
        class_acc_tensor = K.cast(K.equal(class_id_true, class_id_preds), 'int32') * accuracy_mask
        class_acc = K.sum(class_acc_tensor) / K.maximum(K.sum(accuracy_mask), 1)
        return class_acc
    return fn

并将其用作:

model.compile(..., metrics=[single_class_accuracy(INTERESTING_CLASS_ID)])

这篇关于如何在 Keras 中为张量创建布尔掩码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆