如何有条件地将值分配给张量[损失函数的掩蔽]?
How to conditionally assign values to tensor [masking for 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)
我当前的代码屈服于 TypeError: 'Tensor' object does not support item assignment
(在第二行)。执行此操作的张量流方式是什么?我还尝试使用 tf.reduce_sum(labels_mask)
将损失归一化,我希望它能像这样工作。
如果要这么写,就得用Tensorflow的scatter
赋值方法了。不幸的是,tensorflow 也不真正支持布尔索引(新的 boolean_select
使它成为可能,但很烦人)。写起来会很棘手,阅读起来也很困难。
你有两个不那么烦人的选项:
- 使用
labels_mask > 0
作为布尔掩码,使用Tensorflow最近的boolean_mask函数。也许这是更张量流的方式,因为它调用任意特定的函数。
- 将
labels_mask > 0
转换为浮动:tf.cast(labels_mask > 0, tf.float32)
。然后,您可以在代码的最后一行按照您想要的方式使用它。
这是一个如何应用布尔索引并有条件地为变量赋值的示例:
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]
我想创建一个 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)
我当前的代码屈服于 TypeError: 'Tensor' object does not support item assignment
(在第二行)。执行此操作的张量流方式是什么?我还尝试使用 tf.reduce_sum(labels_mask)
将损失归一化,我希望它能像这样工作。
如果要这么写,就得用Tensorflow的scatter
赋值方法了。不幸的是,tensorflow 也不真正支持布尔索引(新的 boolean_select
使它成为可能,但很烦人)。写起来会很棘手,阅读起来也很困难。
你有两个不那么烦人的选项:
- 使用
labels_mask > 0
作为布尔掩码,使用Tensorflow最近的boolean_mask函数。也许这是更张量流的方式,因为它调用任意特定的函数。 - 将
labels_mask > 0
转换为浮动:tf.cast(labels_mask > 0, tf.float32)
。然后,您可以在代码的最后一行按照您想要的方式使用它。
这是一个如何应用布尔索引并有条件地为变量赋值的示例:
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]