2017-08-20 17 views
4

tf.assignと代入演算子(=)の違いを理解しようとしています。 Iは、代入演算子をtf.assignと代入演算子(=)の相違点

import tensorflow as tf 

with tf.Graph().as_default(): 
    a = tf.Variable(1, name="a") 
    a = a + 1 
    with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print sess.run(a) 
    print a.eval() 
    print a.eval() 

結果を使用して、出力を

2 
2 
2 

第として期待されている単純なtf.assign

import tensorflow as tf 

with tf.Graph().as_default(): 
    a = tf.Variable(1, name="a") 
    assign_op = tf.assign(a, tf.add(a,1)) 
    with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print sess.run(assign_op) 
    print a.eval() 
    print a.eval() 

を使用して、コード

まず3組を有します依然として2,2,2である。

第三に、私は私の質問は2回目で

  1. ある

    import tensorflow as tf 
    
    with tf.Graph().as_default(): 
        a = tf.Variable(1, name="a") 
        a = tf.assign(a, tf.add(a,1)) 
        with tf.Session() as sess: 
        sess.run(tf.global_variables_initializer()) 
        print sess.run(a) 
        print a.eval() 
        print a.eval() 
    

    両方 tf.assignと代入演算子は今、出力は2となるを使用する3、4

    スニペット(=)を使用して、私はsess.run(a)を持って、それは私が割り当てopを実行しているようです。だから "a = a + 1"は内部的にassign_op = tf.assign(a、a + 1)のような代入演算を作成しますか?セッションで実行されるオペレーションは実際にはassign_opだけですか?しかし、私がa.eval()を実行すると、aをインクリメントし続けないので、evalは "静的な"変数を評価しているようです。

  2. 第3のスニペットの説明方法がわかりません。なぜ2つのエバリュールが増加するのですが、2つ目のエバリュールは2つのスニペットでは違いますか?

ありがとう。

答えて

1

ここでの主な混乱は、a = a + 1を実行すると、結果のテンソルの加算演算a + 1にPython変数aが再割り当てされることです。一方、tf.assignは、TensorFlow変数の値を設定する操作です。

a = tf.Variable(1, name="a") 
a = a + 1 

これは同等です:

を念頭に置いて
a = tf.add(tf.Variable(1, name="a"), 1) 

:使用して第二のスニペット(=)で

、私はsess.runたとき(a)は、それが私は割り当てopを実行しているようだ。だから "a = a + 1"は内部的にassign_op = tf.assign(a、a + 1)のような代入演算を作成しますか? [...]

これはそうかもしれませんが、真実ではありません。上で説明したように、これはPython変数を再割り当てするだけです。 tf.assignまたは変数を変更する他の操作なしでは、値は1のままです。aが評価されるたびに、プログラムは常にa + 1 => 1 + 1を計算します。

第3のスニペットの説明方法がわかりません。なぜ2つのエバリュールが増加するのですが、2つ目のエバリュールは2つのスニペットでは違いますか?第三スニペットの代入テンソルのeval()を呼び出すことも変数の割り当てをトリガーするためだ

(これは現在のセッションでsession.run(a)を行うことと大差はないことに注意してください)。

+0

説明ありがとうございます! – user8490020

+0

確かに、私はそれを受け入れた:)再びありがとう! – user8490020

+0

もう少し長い間それを考えた後、フォローアップの質問があります。 :) 2番目のスニペットでは、 'a = a + 1'はadd_opを変数 'a'に割り当てます。したがって、後続の評価で 'a'値が繰り返し変更されることはありません。しかし、sess.run(a)とa.eval()を実行すると、a.eval()のtf.addの 'a'の値は何ですか? '2'を出力するので、 'a'の値は1になります。しかし、 'a'は既にadd_opに変更されていませんか?もしそうなら、add_opは最初に値2を返し、その後sess.run(a)の後のa.eval()は3を出力するでしょうか?ありがとう! – user8490020

関連する問題