Как условно присвоить значения тензору [маскировка для функции потерь]?

Я хочу создать функцию потери 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), который, я надеюсь, работает так.

2 ответа

Решение

Если вы хотите написать это так, вам придется использовать Tensorflow's scatter метод назначения. К сожалению, тензор потока на самом деле не поддерживает логическое индексирование (новый boolean_select делает это возможным, но раздражает). Было бы сложно писать и трудно читать.

У вас есть два варианта, которые менее раздражают:

  1. использование labels_mask > 0 в качестве логической маски и использовать недавнюю функцию Tensorflow boolean_mask. Может быть, это более тензорный способ, потому что он вызывает произвольно определенные функции.
  2. В ролях 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]
Другие вопросы по тегам