如何有条件地为张量赋值[掩蔽损失函数]?

Sci*_*tas 5 python machine-learning loss tensorflow loss-function

我想创建一个 L2 损失函数,它忽略标签值为 0 的值(=> 像素)。张量batch[1]包含标签,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)
Run Code Online (Sandbox Code Playgroud)

我当前的代码屈服于TypeError: 'Tensor' object does not support item assignment(在第二行)。什么是张量流方式来做到这一点?我还尝试将损失归一化为tf.reduce_sum(labels_mask),我希望它像这样工作。

Iva*_*aev 6

以下是如何应用布尔索引并有条件地将值赋给变量的示例:

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))
Run Code Online (Sandbox Code Playgroud)

输出:

[   0,    0, 1500, 1500,    1, 1500, 1500,    0]
Run Code Online (Sandbox Code Playgroud)

  • @当尝试将其与急切张量一起使用时,我得到 AttributeError: 'EagerTensor' object has no attribute '_lazy_read',有什么方法可以将它与急切张量一起使用吗? (2认同)

Gav*_*ray 4

如果你想这样写,就必须使用Tensorflow的scatter方法进行赋值。不幸的是,tensorflow 也不真正支持布尔索引(新的boolean_select使之成为可能,但很烦人)。写起来会很棘手,读起来也很困难。

您有两个不那么烦人的选择:

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