我想创建一个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)
来规范损失,我希望这是这样的。
发布于 2018-01-30 06:21:25
如果您想这样编写它,则必须使用Tensorflow的scatter
方法进行赋值。不幸的是,tensorflow也不支持布尔索引(新的boolean_select
使它成为可能,但很烦人)。这将是棘手的书写和阅读困难。
您有两个不那么烦人的选项:
labels_mask > 0
作为布尔掩码,并使用Tensorflow最近的遮罩函数。也许这是更多的tensorflow方式,因为它调用任意特定的函数。labels_mask > 0
转换为浮动:tf.cast(labels_mask > 0, tf.float32)
。然后,您可以在代码的最后一行中以您希望的方式使用它。发布于 2018-09-01 10:48:06
下面是如何应用布尔索引和有条件地将值赋值给变量的示例:
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]
https://stackoverflow.com/questions/48510741
复制相似问题