如何将精确匹配/子集的准确性实现为Keras的指标?

时间:2019-06-24 15:25:07

标签: python tensorflow machine-learning keras deep-learning

我正在尝试使用精确匹配/子集准确性作为我的Keras模型的指标。我基本上了解它应该如何工作,但是我在张量操纵方面遇到了困难。

我正在处理55种可能的标签的多标签分类任务。我正在考虑将输出> 0.5视为该标签的正值。我想要一个指标来描述输出与真实标签完全匹配的频率。

我的方法是将y_true转换为tf.bool,将y_pred > 0.5转换为tf.bool,然后返回包含True的张量(如果它们完全匹配),并且False否则。当我进行基本测试时,它似乎可以正常工作,但是当我训练模型时,它始终保持在0.0000上,而无需更改。

def subset_accuracy(y_true, y_pred):
    y_pred_bin = tf.cast(y_pred > 0.5, tf.bool)
    equality = tf.equal(tf.cast(y_true, tf.bool), y_pred_bin)
    return tf.equal(
        tf.cast(tf.math.count_nonzero(equality), tf.int32),
        tf.size(y_true)
    )

我希望该指标会缓慢上升,即使它仅上升到50%左右。但它保持在0.0。

2 个答案:

答案 0 :(得分:0)

建议:独立于模型测试指标。使用模型(以及未经训练的作品),并model.evaluate进行单批处理。通过使用model.predict的输出来手动计算指标。

请确保您的计算和模型输出的度量得出相同的结果,并且该结果对于该批次中的值有意义。

一旦确定您的损失在数学上确实正确;然后可以尝试调试模型。

从代码段中不清楚您认为什么是子集准确性。

例如Keras将categorical_acuracy定义为:

def categorical_accuracy(y_true, y_pred):
    return K.cast(K.equal(K.argmax(y_true, axis=-1),
                          K.argmax(y_pred, axis=-1)),
                  K.floatx())

您如何期望您的准确性指标有所不同。只是确保该值大于0.5?也许您可以考虑修改Keras指标。

答案 1 :(得分:0)

这是另一个选项,已通过tensorflow 2.3进行了测试:

def subset_accuracy(y_true, y_pred):
    threshold = tf.constant(.8, tf.float32)
    gtt_pred = tf.math.greater(y_pred, threshold)
    gtt_true = tf.math.greater(y_true, threshold)
    accuracy = tf.reduce_mean(tf.cast(tf.equal(gtt_pred, gtt_true), tf.float32), axis=-1)
    return accuracy

我会想象tf.cast(y_true, tf.bool)可能是个问题,因为它将浮点数转换为布尔值,因此取决于tf在内部对其进行处理的方式,它可能首先会转换为整数,因此所有<1.0都为零,然后要布尔这就是为什么什么都不会匹​​配,而您只能得到零精度的原因。

以上建议避免了这个问题。