如何有条件地将值赋值给张量[掩盖丢失函数]?

时间:2018-01-29 22:03:52

标签: python tensorflow machine-learning loss loss-function

我想创建一个L2丢失函数,忽略标签值为0的值(=>像素)。张量output包含标签,而(None,300,300,1)是网络的张量输出,都具有labels_mask = tf.identity(batch[1]) labels_mask[labels_mask > 0] = 1 loss = tf.reduce_sum(tf.square((output-batch[1])*labels_mask))/tf.reduce_sum(labels_mask) 的形状。

TypeError: 'Tensor' object does not support item assignment

我当前的代码收益为tf.reduce_sum(labels_mask)(在第二行)。什么是tensorflow方式来做到这一点?我还试图用RecyclerView来规范损失,我希望这样做。

2 个答案:

答案 0 :(得分:3)

如果您想以这种方式编写,则必须使用Tensorflow的scatter方法进行分配。不幸的是,tensorflow也不支持布尔索引(新的boolean_select使其成为可能,但令人讨厌)。写作难以阅读会很棘手。

你有两个不那么讨厌的选择:

  1. 使用labels_mask > 0作为布尔掩码,并使用Tensorflow最近的boolean_mask函数。也许这是更多张量流方式,因为它调用任意特定的函数。
  2. labels_mask > 0投射到浮动:tf.cast(labels_mask > 0, tf.float32)。然后,您可以按照您想要的方式在代码的最后一行使用它。

答案 1 :(得分:2)

这里是一个示例,该示例如何应用布尔索引并有条件地将值分配给Variable:

a = tf.Variable(initial_value=[0, 0, 4, 6, 1, 2, 4, 0])
mask = tf.greater_equal(a, 2)  # [False False  True  True False  True  True False]
indexes = tf.where(mask)  # [[2] [3] [5] [6]], shape=(4, 1)
b = tf.scatter_update(a, mask, tf.constant(1500))

输出:

[   0,    0, 1500, 1500,    1, 1500, 1500,    0]