2017-07-03 157 views
0

給定2d張量(矩陣),我想將它分成幾個大小相等的小張量。您可以將其視爲最大池的預處理。例如,在張量流中動態地將2d張量分成多個張量

1 2 3 4 5 6 7 8 
2 3 4 5 6 7 8 9 
3 4 5 6 7 8 9 10 
4 5 6 7 8 9 10 11 

考慮到動態的desired_size 2 * 4,輸出應該是:

1 2 3 4 
2 3 4 5 

5 6 7 8 
6 7 8 9 

3 4 5 6 
4 5 6 7 

7 8 9 10 
8 9 10 11 

我已經研究了一段時間slicegather。但我仍然不知道如何去做。你能告訴我如何得到那個嗎?提前致謝!

回答

0

你可以使用tf.extract_image_patches,即使原來有些冗長:

import numpy as np 
import tensorflow as tf 

x = tf.constant(np.arange(8) + np.arange(1,5)[:,np.newaxis]) 
e = tf.extract_image_patches(x[tf.newaxis,:,:,tf.newaxis], 
    [1, 2, 4, 1], [1, 2, 4, 1], [1, 1, 1, 1], padding='VALID') 
e = tf.reshape(e, [-1, 2, 4]) 
sess = tf.InteractiveSession() 
e.eval() 

# returns 
# array([[[ 1, 2, 3, 4], 
#   [ 2, 3, 4, 5]], 
#  [[ 5, 6, 7, 8], 
#   [ 6, 7, 8, 9]], 
#  [[ 3, 4, 5, 6], 
#   [ 4, 5, 6, 7]], 
#  [[ 7, 8, 9, 10], 
#   [ 8, 9, 10, 11]]]) 
+0

不知是否形狀可以按這個方法是動態的?謝謝! – user5779223

+0

我不認爲它可以,你必須知道圖形構建過程中輸出的大小。這通常是這種情況。如果您在運行時遇到可變張量尺寸問題,我會很樂意聽到。 – user1735003

+0

感謝您的回覆!事實上,我需要處理'desired_size'是動態的情況,你有什麼想法嗎?謝謝! – user5779223

0

我係有tf.split()

num_splits = 2 
desired_size = (2, 4) 
A = tf.constant(a) 

C = tf.concat(tf.split(A, desired_size[0], 0),1) 
D = tf.reshape(tf.concat(tf.split(C, num_splits*desired_size[0], 1), 0), (-1, desired_size[0], desired_size[1])) 

#The result 
[[[ 1 2 3 4] 
[ 2 3 4 5]] 

[[ 5 6 7 8] 
[ 6 7 8 9]] 

[[ 3 4 5 6] 
[ 4 5 6 7]] 

[[ 7 8 9 10] 
[ 8 9 10 11]]] 

# For num_splits = 4, desired_size = (2, 2) you get 
[[[ 1 2] 
[ 2 3]] 

[[ 3 4] 
[ 4 5]] 

[[ 5 6] 
[ 6 7]] 

[[ 7 8] 
[ 8 9]] 

[[ 3 4] 
[ 4 5]] 

[[ 5 6] 
[ 6 7]] 

[[ 7 8] 
[ 8 9]] 

[[ 9 10] 
[10 11]]] 
+0

感謝您的回答。我認爲你對這個動態的'desired_size'很有希望。但我試過你的代碼並收到這個錯誤:'IndexError:list index out of range'。它指向這行代碼'C = tf.concat(tf.split(A,desired_height,0),1)'其中'desired_height'是一個標量變量。你有任何想法來解決它?謝謝! – user5779223

+0

例如,將'desired_size'的定義更改爲'desired_size = tf.placeholders(tf.int32,(2),name ='desired_size')'並保持不變。並看看它是否仍然有效 – user5779223

+0

這將如何工作。你現在想要張量來分裂另一張張嗎? –