我正在尝试使用精确匹配/子集准确性作为我的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。
答案 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都为零,然后要布尔这就是为什么什么都不会匹配,而您只能得到零精度的原因。
以上建议避免了这个问题。