说我有一个张量A = [a1,a2,...],我想重复张量的元素并形成一个新的张量。每个元素的重复次数在另一个张量B中指示。例如,如果B = [1,3,2,2,..],结果应为[a1,a2,a2,a2,a3,a3,a4 ,a4,...]。有没有一种有效的方法可以在不使用循环的情况下在tensorflow中执行此操作?
答案 0 :(得分:0)
这是从此try that in the TypeScript playground复制的。我正在解释它,因为它很有趣并且没有循环。不知道它是否有效。
如果我们假设我们要重复[3,4,5]
次并重复tf.cumsum
次,那么要点是它们会创建这样的稀疏张量。
[1。 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0。]
并巧妙地使用tf.cumsum([3,4,5]
填充它。
[1。 1. 1. 2. 2. 2. 2. 2. 3. 3. 3. 3. 3。]
我在这里尽可能地解释程序。
[ 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
的索引。
[1。 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0。]
然后使用[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
。
[3, 4, 5]
作为output_shape是输出中所需的总占位符,它是我们的重复张量print(sess.run(
tf.cumsum(
tf.sparse_to_dense(
sparse_indices=[0, 3, 7],
output_shape=(12,),
sparse_values=[1, 1, 1]))))
这给出了最终的输出。
----RID---Name-----
1 Process1
2 Process2