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