Python 如何为Keras中的张量创建布尔掩码?

Python 如何为Keras中的张量创建布尔掩码?,python,tensorflow,neural-network,keras,Python,Tensorflow,Neural Network,Keras,我正在构建一个自定义度量,以在培训期间测量我的多类数据集中一个类的准确性。我选这门课有困难 目标是一个热点(例如:类0标签是[1 0 0 0]): 问题是,我们必须使用Keras函数来索引张量。如何为张量创建布尔掩码?请注意,在讨论一个类的精度时,一个类可能指以下两个量中的任意一个(不等效): 召回,对于C类而言,是用C类标记的预测为C类的示例的比率 精度,对于C类而言,是预测为C类且实际标记为C类的示例的比率 不必进行复杂的索引,您只需依靠掩蔽进行计算。假设我们在这里讨论的是精确性(更改为

我正在构建一个自定义度量,以在培训期间测量我的多类数据集中一个类的准确性。我选这门课有困难

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


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

请注意,在讨论一个类的精度时,一个类可能指以下两个量中的任意一个(不等效):

  • 召回,对于C类而言,是用C类标记的预测为C类的示例的比率
  • 精度,对于C类而言,是预测为C类且实际标记为C类的示例的比率
不必进行复杂的索引,您只需依靠掩蔽进行计算。假设我们在这里讨论的是精确性(更改为召回将是微不足道的)

如果希望更加灵活,还可以将感兴趣的类参数化:

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,也不知道您的代码是否可以使用布尔掩码或显式索引。您是否将掩码转换为布尔类型?转换(二进制_掩码,tf.bool)。使用Theano,您可以使用bool_mask.nonzero()获取布尔掩码的索引。让我们知道这个解决方案是否有效。你会接受使用回调的答案吗?只是为了确保-y_true是2D?这里的行和列应该代表什么?精确度和召回率可以结合在一起,这个度量称为F1分数。这是精确性和召回率的调和平均值,也是测试准确度的衡量标准。尽管F1成绩(以及精确性和召回率)没有考虑真正的负面因素,但需要注意的是。这在很大程度上取决于一个人在选择一个合适的度量标准时实际做了什么。这里的class_num_真是什么?@Nucl3ic Woops,我的错,它应该是
class_id_真
,我想,我已经改变了它。@jdehesa非常感谢你的回答,这正是我需要的。快速澄清。“将class_id_true替换为class_id_preds以便在此处调用”
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)])