Скажем, у меня есть тензор A = [a1, a2,...], я хочу повторить элемент тензора и сформировать новый тензор. Число повторений каждого элемента указывается в другом тензоре B. Например, если B = [1,3,2,2,...], результат должен быть [a1, a2, a2, a2, a3, a3, a4, a4,...]. Есть ли эффективный способ выполнить это в тензорном потоке без использования цикла?
Это копируется из этой проблемы. Я интерпретирую его, потому что он интересен, и он без петель. Не знаю, эффективна она или нет.
Если мы предположим, что мы хотим повторить [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]))))