2016-11-08 3 views
1

다음 코드 세그먼트가 어떻게 실행되는지 혼동합니다. 이 라인 x += 3 기본 그래프의 일부가 아닌 것을
0
3
3
5
8TensorFlow : 변수를 여러 번 초기화하는 중

인가 :

import tensorflow as tf 

x = tf.Variable(0) 
init_op = tf.initialize_all_variables() 
modify_op = x.assign(5) 

with tf.Session() as sess: 
    sess.run(init_op) 
    print(sess.run(x)) 
    x += 3 
    print(sess.run(x)) 
    sess.run(init_op) # Trying to initialize x once again to 0 
    print(sess.run(x)) # Gives out 3, which leaves me confused. 
    print(sess.run(modify_op)) 
    print(sess.run(x)) # Gives out 8, even more confusing 

출력입니까? 아니면 다른 일이 벌어지고있는거야? 어떤 도움을 주시면 감사하겠습니다.

+2

그래프에서 x = x + 3 행을 추가했기 때문에 그 모양이 보입니다. 명확하게하기 위해 : 당신이 정의한 오래된 x는 variable_0 또는 그와 비슷한 이름을 가지며 이제는 새로운 텐서가 더 이상 variable_0이 아니라 variable_1 = variable_0 + 3이됩니다. 그것은 당신이 3 (0 + 3)과 8 (5 + 3)을 얻는 이유를 설명합니다. Variable_0은 여전히 ​​어딘가에 있지만 sess.run (graph.get_tensor_by_name ("variable_0"))을 인쇄하면 변경되지 않았습니다. 그러면 예상 한 결과를 얻을 수 있습니다. 변수의 이름이 무엇인지 알아 내려면 그래프를 그래프로 보아라. – jean

+0

감사합니다. @jean, 저를 도왔습니다. – stark

답변

2

귀하의 x 변수는하지만 예상 할 수있는 방식으로

x += 3 

에 의해 변경되고있다. tensorflow 라이브러리 코드는 +을 오버라이드하므로 새로운 TF 텐서에 대해 내용 x을 효과적으로 바꿔 넣을 수 있습니다 (이전의 것은 여전히 ​​그래프에 있으며 x는 이제 새로운 점을 가리킴). 이것을 다음과 같이 적어보십시오.

x = tf.Variable(0) + 3 

무엇이 일어나고 있는지 명확하게 알 수 있습니다. 또한 일부 인쇄 문을 삽입하십시오. . .

x = tf.Variable(0) 
print(x) 
# <tensorflow.python.ops.variables.Variable object at 0x1018f5d68> 

x += 3 
print(x) 
# Tensor("add:0", shape=(), dtype=int32) 

x의 내용이 당신에게 중요하다면

다음 재 할당 당신이/디스플레이 x 나중에 변수 이름을 사용하여 추적하려는 경우 x에 피하십시오. 또는, 텐서를 명명하고 편리한 파이썬 변수가없는 경우 그래프에서 직접 가져올 수 있습니다. 중요한 것은 TF 변수와 Python 변수를 분리하는 데 익숙해 져야한다는 것입니다.

TF 변수는 할당 당신이하려고하는 TF 할당 연산자 사용할 필요가있다로 다시 설정되는 사실보고 : 당신 말하자면

0 
3 
0 

:

import tensorflow as tf 

x = tf.Variable(0) 

with tf.Session() as session: 
    session.run(tf.initialize_all_variables()) 
    print(x.eval()) 

    session.run(x.assign(x + 3)) 
    print(x.eval()) 

    session.run(tf.initialize_all_variables()) 
    print(x.eval()) 

이 출력을 기대하고있다.

+0

고마워, 그거 지워. 그래서 그래프에 변경 내용을 반영하려면'tf.add','tf.assign' 및'tf.assign_add' 패밀리를 사용해야합니다. – stark

+0

@stark : 너는 꼭 할 필요 없어. 그러면 너를 구해주지 않을거야. 나중에 변수 이름을 사용하여'x'를 추적/표시하려면'x'에 다시 지정하는 것을 피하십시오. 또는, 텐서를 명명하고 편리한 파이썬 변수가없는 경우 그래프에서 직접 가져올 수 있습니다. 중요한 것은 TF 변수와 Python 변수 사이의 분리 *에 익숙해지고 있다는 것입니다. –

+0

그 사실을 깨달았습니다. 나는 그걸로 좀 더 주위에 놀거야, 팁 덕분에! – stark

관련 문제