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

我想创建一个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使其成为可能,但使用起来很麻烦)。这样写会很棘手且难以阅读。

你有两个不太麻烦的选择:

  1. 使用labels_mask > 0作为布尔掩码,并使用TensorFlow最近的boolean_mask函数。也许这是更符合TensorFlow的方式,因为它调用了特定的函数。
  2. labels_mask > 0转换为浮点数:tf.cast(labels_mask > 0, tf.float32)。然后,你可以在代码的最后一行按你想要的方式使用它。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注