2017-12-23 12 views
1

나는 텐서 행을 반복하고, 각 행의 인덱스를 검색하고, 다른 텐서의 벡터를 모으기 위해이를 사용하고, 새로운 벡터로 결합하는 루프를 구현하려고합니다. 텐서. 문제는 각 행에 다른 수의 인덱스가 포함될 수 있다는 것입니다 (예 : [[-1, -1,1,4, -1], [3, -1, -1, -1, -1]] 첫 번째 행 인덱스 : [1, 4], 두 번째 행 인덱스 [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_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는 사실에 대해 많이 불평 할 것이다 당신 귀하가 신고 한 배열을 사용하고 있지 않습니다.)