2016-06-19 2 views
0

는 I 기본적으로 이런 동작 A으로 연산 그래프를 가지고TensorFlow의 그래프 노드에 부작용이있는 동시 계산을 추가하는 올바른 방법은 무엇입니까?

 | 
    o 
    | 
    A 
    | 
    o 
    | 

및 I는 텐서 (이 경우 가변 할당) A 흐르는 동안 추가 계산 B 호출하고자 :

 | 
     o 
    /\ 
    A B 
    \/
     o 
     | 

튜플이 작업을 수행 할 수 있도록 보인다,하지만 난이 그 일을하는 가장 좋은 방법인지 궁금 :

import tensorflow as tf 
sess = tf.Session() 
v = tf.Variable(0) 
sess.run(tf.initialize_all_variables()) 
A = tf.constant(1) 
A, _ = tf.tuple([A, v.assign(2)]) 
print(sess.run(A)) # prints 1 
print(sess.run(v)) # prints 2 
가 0

이 모든 것은 순방향 활성화가 통과 할 때 레이어 가중치 및 기타 변수가 업데이트되는 계층 적 계산의 컨텍스트에 있습니다. 대안은 아마 이러한 업데이트를 fwd_update_ops 목록에 축적하고 마지막으로 sess.run([fwd_update_ops, bwd_update_ops], feed_dict)을 호출하는 것입니다. 다른 대안이 있습니까? 그것을하는 가장 좋은 방법은 무엇입니까? 코멘트에

@YaroslavBulatov에서
+0

기본적으로 동시 처리됩니다. 즉 c = a + b는 a와 b eval을 병렬로 가질 것입니다. –

+0

그러나 나는 결코 + b를 계산하지 않습니다. 변수 ('B')에 값을 지정하여 A의 자손을 실행하는 부작용을 원합니다. 'B' 액션이 후손에게 연결되지 않으면'B'가 실행되지 않습니다. 더 명확하게 질문 제목을 업데이트했습니다. –

+1

어쩌면 tf.control_dependencies –

답변

1

을 :

당신은 tf.control_dependencies([...])를 사용해야합니다.

예를 들어, update_opres = tf.square(A)에 따라 작업이 당신이 쓸 수 있도록합니다 : update_op이 실행될 때까지

v = tf.Variable(0, name='v') 
A = tf.constant(3, name='A') 

update_op = v.assign(2) 

with tf.control_dependencies([update_op]): 
    res = tf.square(A, name='square') 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    print(sess.run(res)) # prints 9 
    print(sess.run(v)) # prints 2, because v got updated 

실행의 측면에서, 작업 tf.square(A)을 기다립니다.

 | 
     o 
     | 
     A update_op 
     | /
    square 
     | 
관련 문제