2017-12-23 20 views
1

テンソルの行を繰り返し処理するループを実装しようとしていて、各行のインデックスを取得し、別のテンソルのベクトルを集めて最後に新しいベクトルテンソル。 問題は、各行に異なる数のインデックスが含まれている可能性があります(例:[[-1、-1,1,4、-1]、[3、-1、-1、-1、-1]]最初の行インデックス:[1,4]、第2行インデックス[3])。 tf.while_loopまたはtf.scanを使用すると問題が発生します。最初のものでは、集められたすべてのテンソルを一緒に積み重ねる方法を理解していません。代わりに、すべての出力が同じ形状を持つようにします(すべての出力が[なし、10]の一般的な形を持っているとは思われません)。TensorFlow:whileループでテンソルを積み重ねる

これまで誰かが似たようなことを試みましたか?

私はWHILE_LOOP用のコードを付加しています:

i = tf.constant(0) 
def body(i, merging): 
    i += 1 
    print('i', i) 
    i_row = tf.gather(dense, [i]) 
    i_indices = tf.where(i_row > 0)[:, 1] 
    i_vecs = tf.gather(embeddings_ph, i_indices) 
    return i, i_vecs 

tf.while_loop(lambda i, merging : tf.less(i, 2), body, 
       loop_vars=[i,merging], 
       shape_invariants=[i.get_shape(), 
           tf.TensorShape((None, 3))], 
       name='vecs_gathering') 

何そのここに欠けていることは、新たなテンソルで一緒に(各iについてi_vec)をすべてWHILE_LOOP出力を積み重ねることです。

答えて

1

いいえ、rnnの実装からインスピレーションを得ました。私は次のように私のコードを修正し、それが完璧に動作します:

def body(i, outputs): 
    i_row = tf.gather(dense, [i]) 
    i_indices = tf.where(i_row > 0)[:, 1] 
    i_vecs = tf.gather(embeddings_ph, i_indices) 
    outputs = outputs.write(i, i_vecs) 
    i += 1 
return i, outputs 

outputs = tf.TensorArray(dtype=tf.float32, infer_shape=False, size=1, 
        dynamic_size=True) 
_, outputs = tf.while_loop(lambda i, *_: tf.less(i, 3), body,[0,outputs]) 

outputs = outputs.concat() 

私はあなたが書き込みを実行するときにTensorArrayの値を再割り当てしなければならないという事実を強調するためにもしたい(そうでない場合は、TFが事実について多くのことを文句を言うでしょう、あなたはあなたが宣言した配列を使用していません)

関連する問題