【问题标题】:Tensorflow how to check if a tensor row is only zeroes?Tensorflow如何检查张量行是否只有零?
【发布时间】:2016-03-03 22:08:33
【问题描述】:

我正在训练一个简单的网络来预测单个对象的边界框坐标。然而,有些照片找不到任何物体。由于网络总是进行预测,因此它还预测了一个介于 0 和 1 之间的置信度值,该值应该表示图片中存在对象的概率。我的预测张量称为logits,它是(batch_size, 5)张量(置信度、x、y、宽度和高度)。同样,labels 张量也是(batch_size, 5)

以前我只用总是有对象的图像进行训练,所以我基本上可以做到

loss = tf.l2_loss(logits - labels)

我也想用没有对象的图片开始训练,当图片中没有对象时,我不希望网络因其预测的坐标而受到惩罚。在这种情况下,最重要的是置信度值,它应该接近于 0(没有对象)。

我应该如何构建我的标签和损失函数来实现这一点?我可以将没有对象的图像的标签设置为全零,但是如何检查特定行是否只有零?并且在这种情况下,logits 中的相应行也需要设置为零(置信度值除外!),以便因坐标而产生的损失也为零。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    您可以使用tf.math.count_nonzero() 检查张量是否全为零。您可以查看指南here

    【讨论】:

      【解决方案2】:

      一种查找张量的一行是否全为零的方法:

      import tensorflow as tf
      
      image = tf.fill([8,8], 0)
      sess = tf.Session()
      sess.run(tf.initialize_all_variables())
      image_row = tf.slice(image, [1,0], [1, -1])
      total = tf.reduce_sum(tf.abs(image_row))
      is_all_zero = tf.equal(total, 0)
      print sess.run([total, is_all_zero, image_row])
      

      结果:

      [0, True, array([[0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)]
      

      【讨论】:

      • 这解决了 OP 的问题,但实际上并没有检查该行是否全为零,而是总和为零。一行可能包含[100, -100,0,0,0],并且总和为零。如果您切换了一些东西,那么它可以在其他场景中始终如一地工作,并更准确地匹配 OP 问题的标题。
      • 先取绝对值
      • 谢谢,添加了 abs 运算符来解决此问题。
      • 当前版本的 TensorFlow (r1.1) 中更明确的选项是 tf.logical_not(tf.reduce_all(tf.equal(image,0),axis=0))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多