假设你有一个n维Tensor,其中一个维对应于时间。
我想做的是:给定某个整数window_size
,我想用两个新的维度[..., n_groups, window_size]
替换我的时间维度。其中n_groups
代表时间维度上所有可能的大小为window_size
的分组。因此,如果我们从大小为n_periods
的时间维度开始,那么n_groups
最终应该是n_periods - window_size
。
使用传统的“Python”循环和切片可以很容易地完成所有这些操作,例如:
stacked = tf.stack([inputs[i:i+window_size] for i in range(len(inputs) - window_size + 1)], axis=0)
但是,如果时间维度非常长,则会产生数量惊人的图形操作。我想知道是否有内置的TensorFlow函数可以帮助我更高效地完成这项相对简单的任务...
“滚动窗口分组”的概念非常普遍,以至于Pandas项目有一个非常复杂的sizeable API来处理这种特殊情况。我本以为TensorFlow也会包含这样的实用程序。
1条答案
按热度按时间omvjsjqw1#
考虑关于map_fn的tf文档:
"map_fn会将fn使用的运算应用于elems的每个元素,从而导致O(elems. shape [0])个总运算。由于map_fn可以并行处理元素,这在一定程度上有所缓解。但是,使用map_fn表示的转换通常仍低于使用矢量化运算表示的等效转换。"
在给定输入Tensor的情况下,可以尝试以下方法:
转换为方阵:
然后将map_fn应用于该Tensor,包括输入中的具有负值的范围向量:
这会将元素排列为(左侧):
最后,使用Tensor切片获取所需的元素,如下所示:
给出:
对于窗口= 4
给出:
尝试将其转换为一个tf图,看看它是否比普通的python循环有更好的性能。