Как создать логическую маску в тензорном потоке со средним диапазоном, установленным только на True, с использованием индексации, указанной в другом тензоре

У меня есть тензор формы [Нет, 1], состоящий из значения для каждой партии. Используя этот тензор, я должен создать логическую маску со значениями, установленными на true, начиная с значения индекса (из тензора) соответствующей партии до фиксированной длины, а остальные - на false.

Например, рассматриваем тензор индекса как

[[1],[2],[2]]

Предположим, что желаемая длина временных шагов для каждого пакета равна 5, а фиксированная длина равна 2, тогда для первого пакета в индексах, начиная с 1 и заканчивая 2 (как фиксированная длина = 2), значения должны быть установлены True. То же самое и для других партий. то есть я хочу, чтобы моя логическая маска была создана

[[False,True,True,False,False],
 [False,False,True,True,False],
 [False,False,True,True,False]]

Как достичь вышеуказанного, не делая индивидуально для каждой партии? И желательно без использования рваной функции в тензорном потоке?

index < tf.range(number_of_timesteps) 

Вышеупомянутое можно использовать для установки True в крайних случаях, но я не смог найти способ установить True в середине.


person Vyshnavi Gutta    schedule 10.07.2020    source источник


Ответы (1)


Решение вашего примера может быть выполнено с помощью комбинации tf.one_hot и tf.roll.

input = [[1],[2],[2]]
intermediate_output = tf.one_hot(input, 5)
output = intermediate_output + tf.roll(intermediate_output, shift=1,axis=2)

Если вам нужно преобразовать в логическое значение из нулей и единиц

output = tf.where(tf.equal(output, 1), True, False)

Объяснение: tf.one_hot используется для преобразования ваших индексов в промежуточное горячее представление. Далее tf.roll сдвигает промежуточное представление на 1. Объединение этого с промежуточным представлением и преобразование в логическое возвращает желаемый результат.

РЕДАКТИРОВАТЬ:

Я не вижу другого хорошего способа, кроме цикла for, расширить это до нескольких временных шагов. Приведенный ниже код сгенерирует желаемый результат

input = [[1],[2],[2]]
intermediate_output = tf.one_hot(input, 5)

outputs = []
timesteps = 3
for i in range(timesteps):
  outputs.append(tf.roll(intermediate_output, shift=i,axis=2))

output = tf.reduce_sum(tf.unstack(outputs, timesteps), 2)
output = tf.where(tf.equal(output, 1), True, False)

person DMolony    schedule 10.07.2020
comment
Привет, я также хотел бы иметь фиксированную длину как переменную. если длина равна 3, то вывод должен быть [[False,True,True,True,False], [False,False,True,True,True], [False,False,True,True,True]] - person Vyshnavi Gutta; 10.07.2020