我想创建一个L2损失函数,该函数忽略标签值为0的数值(即像素)。张量batch[1]
包含标签,而output
是网络输出的张量,两者的形状都是(None,300,300,1)
。
labels_mask = tf.identity(batch[1])labels_mask[labels_mask > 0] = 1loss = tf.reduce_sum(tf.square((output-batch[1])*labels_mask))/tf.reduce_sum(labels_mask)
我当前的代码导致TypeError: 'Tensor' object does not support item assignment
(在第二行)。TensorFlow中如何实现这个功能?我还尝试使用tf.reduce_sum(labels_mask)
来归一化损失,希望这样可以正常工作。
回答:
如果你想按那种方式编写,你需要使用TensorFlow的scatter
方法进行赋值。不幸的是,TensorFlow并不真正支持布尔索引(新的boolean_select
使其成为可能,但使用起来很麻烦)。这样写会很棘手且难以阅读。
你有两个不太麻烦的选择:
- 使用
labels_mask > 0
作为布尔掩码,并使用TensorFlow最近的boolean_mask函数。也许这是更符合TensorFlow的方式,因为它调用了特定的函数。 - 将
labels_mask > 0
转换为浮点数:tf.cast(labels_mask > 0, tf.float32)
。然后,你可以在代码的最后一行按你想要的方式使用它。