将张量重塑为序列的最有效方法

时间:2017-07-26 09:01:57

标签: tensorflow

我正在使用TensorFlow中的音频,并希望获得一系列序列,这些序列可以从滑动窗口获取我的数据,可以这么说。举例说明我的情况:

当前数据格式:

Shape = [batch_size,num_features]

example = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11, 12],
  [13, 14, 15]
]

我想要的是什么:

Shape = [batch_size - window_length + 1,window_length,num_features]

example = [
  [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  [
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12]
  ],
  [
    [7, 8, 9],
    [10, 11, 12],
    [13, 14, 15]
  ],
]

我目前的解决方案是做这样的事情:

list_of_windows_of_data = []
for x in range(batch_size - window_length + 1):
    list_of_windows_of_data.append(tf.slice(data, [x, 0], [window_length,
            num_features]))
windowed_data = tf.squeeze(tf.stack(list_of_windows_of_data, axis=0))

这就是转变。但是,它还会创建20,000个操作,这会在创建图形时减慢TensorFlow的速度。如果其他人有一个有趣且更有效的方法,请分享。

2 个答案:

答案 0 :(得分:2)

您可以使用tf.map_fn执行此操作,如下所示:

example = tf.constant([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11, 12],
  [13, 14, 15]
]
)
res = tf.map_fn(lambda i: example[i:i+3], tf.range(example.shape[0]-2), dtype=tf.int32)
sess=tf.InteractiveSession()
res.eval()

打印

array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]],

       [[ 7,  8,  9],
        [10, 11, 12],
        [13, 14, 15]]])

答案 1 :(得分:1)

您可以使用内置的tf.extract_image_patches

example = tf.constant([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11, 12],
  [13, 14, 15]
]
)
res = tf.reshape(tf.extract_image_patches(example[None,...,None],
  [1,3,3,1], [1,1,1,1], [1,1,1,1], 'VALID'), [-1,3,3])