2017-07-26 24 views
0

我正在使用TensorFlow中的音频,并希望获得一系列可从获取的序列,可以在我的数据上滑动窗口。例子来说明我的情况:将张量重构为序列的最有效方式

当前数据格式:

外形= [batch_size时,NUM_FEATURES]

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

我想要什么:

外形= [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

你可以做到这一点使用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]]]) 
+0

我终于可以测试并实施这一点。你已经削减了所有20,000的额外操作,同时仍然提供相同的输出。 TF图几乎立即加载,这真是太棒了!有趣的是,这个解决方案几乎使我目前的批处理时间翻了一番。这可能是让tensorflow花费一分钟设置它的图形并动态地进行交换。无论如何,真棒和整洁的解决方案。谢谢! –

+0

不客气:) –

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]) 
相关问题