首页 > 解决方案 > 在张量流中跨维度添加连续元素(np.add.reduceat)

问题描述

是否有任何 tensorflow 功能或优雅的执行以下任务

考虑我有维度说 $3 \times 10$ 的二维张量。现在我想沿维度 $1$(或行)添加连续元素,其中要添加的连续元素的数量由张量决定。如果它说 $[2,2 ,4,2]$ 输出张量的大小应为 $ 3 \times 4$。因为 $ [ a_1 + a_2 , a_3+a_4 , a_5+a_6+a_7+a_8 , a_9+a_10]$ 会在每一行张量

前任:

$\begin{bmatrix}
1 & 2 & 3 & 4 & 5 & 6 & 1 & 2 & 3 &4\\ 
7 & 8 & 9 & 10 &11  &12 & 7 & 8 & 9 & 10\\ 
13 &14  &15  &16  &17  &18 & 13 &14 &15 &16
\end{bmatrix}$

并且输出应该如下

$\begin{bmatrix}
3 & 7 & 14 & 7\\ 
15 & 19 &38 &19\\ 
27  &31 & 62 &31
\end{bmatrix}$

编辑:在 numpy np.add.reduceat中似乎有这个功能

标签: tensorflow

解决方案


张量流中没有这样的功能。但是您可以通过拆分数组来构造它:

def tf_reduceat(data, at_array, axis=-1):
    split_data = tf.split(data, at_array, axis=axis)
    return tf.stack([tf.reduce_sum(i, axis=axis) for i in split_data], axis=axis)


a = tf.constant([[1, 2, 3, 4, 5, 6, 1, 2, 3, 4], 
                 [7, 8, 9, 10, 11, 12, 7, 8, 9, 10], 
                 [13, 14, 15, 16, 17, 18, 13, 14, 15, 16]])
result = tf_reduceat(a, [2, 2, 4, 2])

运行结果产生:

array([[ 3,  7, 14,  7],                                                                                                       
       [15, 19, 38, 19],                                                                                                       
       [27, 31, 62, 31]], dtype=int32)

推荐阅读