【问题标题】:How to check if the argmax of a tensor is equal to any argmax of another tensor which has several equal max?如何检查一个张量的 argmax 是否等于另一个具有多个相等最大值的张量的任何 argmax?
【发布时间】:2018-03-30 23:10:10
【问题描述】:

所以通常在单标签分类中,我们使用如下

correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(self.label, 1))

但我正在处理多标签分类,所以我想知道如何在标签向量中有多个标签的情况下做到这一点。所以到目前为止我所拥有的如下

 a = tf.constant([0.2, 0.4, 0.3, 0.1])
 b = tf.constant([0,1.0,1,0])
 empty_tensor = tf.zeros([0])
 for index in range(b.get_shape()[0]):
     empty_tensor = tf.cond(tf.equal(b[index],tf.constant(1, dtype = 
     tf.float32)), lambda:  tf.concat([empty_tensor,tf.constant([index], 
     dtype = tf.float32)], axis = 0), lambda: empty_tensor)

 temp, _ = tf.setdiff1d([tf.argmax(a)], tf.cast(empty_tensor, dtype= tf.int64))
 output, _ = tf.setdiff1d([tf.argmax(a)], tf.cast(temp, dtype = tf.int64))

所以这给了我 max(preds) 发生的索引,以及 self.label 中 1 的位置。在上面的例子中,它给出 [1],如果 argmax 不匹配,那么我得到 []。

我遇到的问题是我不知道如何从那里继续,因为我想要以下内容

correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(self.label, 1))
self.accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))

这对于单标签分类很简单。

非常感谢

【问题讨论】:

  • 我的问题更多是关于如何编码预测和真实标签的对应计数(即索引相同的位置)。
  • 我不会将此称为完全重复,因为该问题专门针对 Tensorflow。但是,可以将问题标题更改为“Tensorflow 中的多标签分类和准确性”,以便更通用,从而更容易被其他人找到。

标签: tensorflow indices tensor argmax


【解决方案1】:

我不认为你可以使用 softmax 来实现这一点,所以我假设你正在使用 sigmoids 作为你的 preds。如果您使用 sigmoid,您的输出将(独立地)介于 0 和 1 之间。您可以为每个定义一个阈值,可能是 0.5,然后将您的 sigmoid preds 转换为 label 编码(0 和 1)通过preds > 0.5

如果预测为 [0 1] 且标签为 [1 1],您要报告完全错误还是部分错误?我将假设前者。在这种情况下,您将删除 tf.argmax 调用,而是检查 predslabel 是否是完全相同的向量,看起来像 tf.reduce_all(tf.equal(preds, label), axis=0)。对于后者,代码类似于tf.reduce_sum(tf.equal(preds, label), axis=0)

【讨论】:

  • 首先,非常感谢您的回答。是的,最终这就是我要做的。但是,我仍然会遇到与以前相同的问题来计算正确分类的出现,我在预测和标签中会有几个?
  • 没问题,正确。如果预测是 [0 1] 和 [1 1],您要报告完全错误还是部分错误?我将假设前者。在这种情况下,您将删除 tf.argmax 调用,而是检查 preds 和 self.label 是否是完全相同的向量,看起来像 tf.reduce_all(tf.equal(preds, label), axis=0)。我会把这个添加到答案中。
  • 在这种情况下,我实际上想计算匹配的数量以及标签中的总数。所以我会有 1 和 2 作为输出。
  • 糟糕,我漏了一个字;它应该是“如果预测是 [0 1] 并且标签是 [1 1],......”。在这种情况下,您想使用tf.equal,后跟tf.reduce_sum
  • 谢谢!这确实是我要问的。虽然,在尝试了您的解决方案之后,似乎需要先转换 tf.reduce_sum,因为它不处理 bool。 tf.reduce_all 可以用 bools 检查是否全部为真。
猜你喜欢
  • 2023-03-05
  • 2020-10-19
  • 2011-11-20
  • 2021-03-28
  • 1970-01-01
  • 2016-01-04
  • 2021-08-13
  • 2019-11-17
相关资源
最近更新 更多