【问题标题】:How to conditionally assign values to tensor [masking for loss function]?如何有条件地为张量赋值[屏蔽损失函数]?
【发布时间】:2018-07-08 16:59:47
【问题描述】:

我想创建一个忽略标签值为 0 的值(=> 像素)的 L2 损失函数。张量 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) 使损失正常化,我希望它可以像这样工作。

【问题讨论】:

    标签: python tensorflow machine-learning loss loss-function


    【解决方案1】:

    这是一个如何应用布尔索引并有条件地为变量赋值的示例:

    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]
    

    【讨论】:

    • @当试图将它与热切张量一起使用时,我得到 AttributeError: 'EagerTensor' object has no attribute '_lazy_read',有没有办法将它与热切张量一起使用?
    • indexes = tf.where(mask) 行有什么用吗?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2019-01-24
      • 2019-04-03
      • 2018-04-13
      相关资源
      最近更新 更多