我想对分类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。
答案 0 :(得分:2)
最好在张量流之外进行这种类型的后处理评估,在这种情况下尝试几个不同的阈值更为自然。
如果要在tensorflow中进行操作,可以考虑:
predictions = tf.math.greater(logits, tf.constant(0.5))
对于所有大于0.5的条目,这将返回具有True的原始logits形状的张量。然后,您可以像以前一样计算准确性。这适用于对于给定样本可以同时显示多个标签的情况。
答案 1 :(得分:1)
使用以下代码计算多类分类的准确性:
tf.argmax
将返回max
和y_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]