Повторите элемент тензора и сформируйте новый тензор в тензорном потоке

1

Скажем, у меня есть тензор A = [a1, a2,...], я хочу повторить элемент тензора и сформировать новый тензор. Число повторений каждого элемента указывается в другом тензоре B. Например, если B = [1,3,2,2,...], результат должен быть [a1, a2, a2, a2, a3, a3, a4, a4,...]. Есть ли эффективный способ выполнить это в тензорном потоке без использования цикла?

Теги:
tensorflow

1 ответ

0

Это копируется из этой проблемы. Я интерпретирую его, потому что он интересен, и он без петель. Не знаю, эффективна она или нет.

Если мы предположим, что мы хотим повторить [1,2,3] с [3,4,5] повторениями, то суть в том, что они создают такой разреженный тензор.

[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

и наполните его так, используя tf.cumsum ловко.

[1. 1. 1. 2. 2. 2. 2. 3. 3. 3. 3. 3.]

Я интерпретирую процедуру как можно больше здесь.

tf.cumsum([3,4,5] дает [ 3 7 12]

tf.cumsum([3, 4, 5][:-1]) дает [3 7] после удаления последнего элемента 12.

tf.concat([tf.constant([0], dtype=tf.int32), tf.cumsum([3,4,5][:-1])], axis=0) дает [0 3 7] которые являются индексами, где мы видим 1.

[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

И 1 получается с использованием [1,2,3] - tf.concat([tf.constant([0], dtype=tf.float64), [1,2,3][:-1]], axis=0)

что эквивалентно вычитанию таким образом. [1, 2, 3] - [0, 1, 2]. Это дает [1 1 1] значения для разреженных индексов.

12 поскольку output_shape является общим заполнителем, требуемым на выходе, который является уменьшенной суммарной суммой нашего тензора повтора [3, 4, 5]

Это дает окончательный результат.

print(sess.run(
    tf.cumsum(
    tf.sparse_to_dense(
    sparse_indices=[0, 3, 7],
    output_shape=(12,),
    sparse_values=[1, 1, 1]))))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню