2017-07-03 10 views
0

2次元テンソル(行列)を与えられたら、同じサイズのいくつかの小さなテンソルに分割したいと思います。最大プールの前処理と見なすことができます。例えば、2×4の動的desired_size考える2次元テンソルをテンソルフロー内の複数のテンソルに動的に分割する

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 

は、出力すべきである:

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 

Iしばらく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:リストのインデックスが範囲外です'。これは、この行のコード '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

どうしたらうまくいきますか? Uはテンソルを別のテンソルを分割するために使用しますか? –

関連する問題