2016-12-18 9 views
1

TensorFlowのRNNにCNN出力を供給しようとしています。テンソルフローのパッド可変長シーケンス

CNNは10個の画像を処理し、テンソルの形状(1,230,2048)を出力します。ここで、230はすべての画像のシーケンスの総数で、2048は各シーケンスの長さです。

私はベクター内の各画像のシーケンス数を追跡します。たとえば:

[1, 9, 25, 29, 31, 10, 23, 29, 37, 36]

私は最大のシーケンス番号を取得することができ、この場合は37

の質問はどのように異なる位置にパッド(1、230、2048)テンソルをしているだろうすべての画像が同じ数のシーケンス(この例では37)で表されるようにします。

最終テンソルは、形状(1,370,2048)でなければなりません。

ありがとうございました

答えて

0

tf.padをご覧ください。ペアのリストを各ディメンションに1組ずつ渡します。

+2

事を私はテンソル内部パッド領域に必要があるということです。テンソル全体ではありません。 – Edgard

2

私はそれを解決するための短いコードを書いた。ここには、シーケンス番号が異なる6つの画像を使った小さな例があります(わかりやすくするためにテンソルにスペースを挿入しました)。

vec = tf.constant([[1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1], 

     [2, 2, 2, 2, 2, 2, 2, 2], 
     [2, 2, 2, 2, 2, 2, 2, 2], 

     [3, 3, 3, 3, 3, 3, 3, 3], 

     [4, 4, 4, 4, 4, 4, 4, 4], 
     [4, 4, 4, 4, 4, 4, 4, 4], 
     [4, 4, 4, 4, 4, 4, 4, 4], 

     [5, 5, 5, 5, 5, 5, 5, 5], 
     [5, 5, 5, 5, 5, 5, 5, 5], 

     [6, 6, 6, 6, 6, 6, 6, 6]], dtype=tf.float32) 

seqLens = [4, 2, 1, 3, 2, 1] 
maxLen = max(seqLens) 

NFeatures = 8 
BatchSize = 6 

n = 0 
offset = sum(seqLens[0:(n)]) 
indices = tf.reshape(tf.range(offset, seqLens[n]+offset), [seqLens[n], 1]) 
res = tf.gather_nd(vec, [indices]) 
res_as_vector = tf.reshape(res, [-1]) 
zero_padding = tf.zeros([NFeatures * maxLen] - tf.shape(res_as_vector), dtype=res.dtype) 
a_padded = tf.concat(0, [res_as_vector, zero_padding]) 
result = tf.reshape(a_padded, [maxLen, NFeatures]) 
Inputs2 = result 

for n in range(1, BatchSize): 
    offset = sum(seqLens[0:(n)]) 
    indices = tf.reshape(tf.range(offset, seqLens[n]+offset), [seqLens[n], 1]) 
    res = tf.gather_nd(vec, [indices]) 
    res_as_vector = tf.reshape(res, [-1]) 
    zero_padding = tf.zeros([NFeatures * maxLen] - tf.shape(res_as_vector), dtype=res.dtype) 
    a_padded = tf.concat(0, [res_as_vector, zero_padding]) 
    result = tf.reshape(a_padded, [maxLen, NFeatures]) 
    Inputs2 = tf.concat(0, [Inputs2, result]) 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print(sess.run(Inputs2)) 

出力は次のようになります。

[[ 1. 1. 1. 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1. 1. 1. 1.] 
[ 1. 1. 1. 1. 1. 1. 1. 1.] 
[ 2. 2. 2. 2. 2. 2. 2. 2.] 
[ 2. 2. 2. 2. 2. 2. 2. 2.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 3. 3. 3. 3. 3. 3. 3. 3.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 4. 4. 4. 4. 4. 4. 4. 4.] 
[ 4. 4. 4. 4. 4. 4. 4. 4.] 
[ 4. 4. 4. 4. 4. 4. 4. 4.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 5. 5. 5. 5. 5. 5. 5. 5.] 
[ 5. 5. 5. 5. 5. 5. 5. 5.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 6. 6. 6. 6. 6. 6. 6. 6.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0.]] 

関連する問題