2016-11-08 5 views
1

次のコードセグメントの実行方法によってちょっと混乱します。TensorFlow:変数を何度も初期化する

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 

これが出力されます。
0
3
3
5
8

は、それがラインx += 3は、デフォルトのグラフの一部ではないということですか?それとも別のことが起こっているのですか?いくつかの助けに感謝されます、ありがとう!

+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"))を印刷すると変更されません。期待通りの結果が得られます。あなたの変数の名前が何であるかを知るには、あなたのグラフをグラフdefで見るだけです。 – jean

+0

ありがとう@ジャン、それは私を助けた。 – stark

答えて

2

あなたx変数ではなく、あなたが期待するかもしれない方法で

x += 3 

によって変更されています。テンソルフローライブラリのコードは+をオーバーライドするので、新しい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に再割り当てを避けます。また、便利なPython変数を指さない場合は、テンソルの名前をつけてグラフから直接取得することもできます。重要なことは、TF変数とPython変数の分離に慣れていることです。あなたがいたとして

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()) 

この出力:実際にTF変数が割り当てられているとあなたがしようとしているとして、再設定、TF代入演算子を使用する必要が見

期待している。

+0

ありがとう、それはそれをクリアします。だから、私は 'tf.add'、' tf.assign'と 'tf.assign_add'ファミリを使ってグラフに反映されるべき変更を忠実に保つべきです。 – stark

+0

@stark:あなたはこれをする必要はありません。それはあなたをここで救うことはできません。後で変数名を使用して 'x'を追跡/表示したい場合は、' x'に再割り当てするのを避けてください。また、便利なPython変数を指さない場合は、テンソルの名前をつけてグラフから直接取得することもできます。重要なことは、TF変数とPython変数の間の*分離*に慣れていることです。 –

+0

ただそれを実現しました。私はそれをもう少し一緒に遊んで、ヒントのおかげで! – stark

関連する問題