Tensorflow Argmax等效于多标签分类

时间:2019-05-14 09:48:55

标签: python tensorflow

我想对分类Tensorflow模型进行评估。

要计算精度,我有以下代码:

predictions = tf.argmax(logits, axis=-1, output_type=tf.int32)
accuracy = tf.metrics.accuracy(labels=label_ids, predictions=logits)

在单标签分类中效果很好,但是现在我想进行多标签分类,其中我的标签是整数数组而不是整数。

以下是存储在{{1}中的标签[0, 1, 1, 0, 1, 0]的示例,以及来自张量label_ids的预测[0.1, 0.8, 0.9, 0.1, 0.6, 0.2]的示例

我应该使用什么功能代替logits? (我的标签是6个整数的数组,值均为0或1)

如果需要,我们可以假设阈值为0.5。

2 个答案:

答案 0 :(得分:2)

最好在张量流之外进行这种类型的后处理评估,在这种情况下尝试几个不同的阈值更为自然。

如果要在tensorflow中进行操作,可以考虑:

predictions = tf.math.greater(logits, tf.constant(0.5))

对于所有大于0.5的条目,这将返回具有True的原始logits形状的张量。然后,您可以像以前一样计算准确性。这适用于对于给定样本可以同时显示多个标签的情况。

答案 1 :(得分:1)

使用以下代码计算多类分类的准确性:

tf.argmax将返回maxy_pred(实际y)的y值为y_true的轴。

另外tf.equal用于查找匹配总数(返回True,False)。

将布尔值转换为浮点数(即0或1),然后使用tf.reduce_mean来计算精度。

correct_mask = tf.equal(tf.argmax(y_pred,1), tf.argmax(y_true,1))
accuracy = tf.reduce_mean(tf.cast(correct_mask, tf.float32))

修改

数据示例:

import numpy as np

y_pred = np.array([[0.1,0.5,0.4], [0.2,0.6,0.2], [0.9,0.05,0.05]])
y_true = np.array([[0,1,0],[0,0,1],[1,0,0]])

correct_mask = tf.equal(tf.argmax(y_pred,1), tf.argmax(y_true,1))
accuracy = tf.reduce_mean(tf.cast(correct_mask, tf.float32))

with tf.Session() as sess:
  # print(sess.run([correct_mask]))
  print(sess.run([accuracy]))

输出:

[0.6666667]