-
tf.assign
是創(chuàng)建一個(gè)操作符這個(gè)操作符具有這個(gè)值變量的值翘鸭,而=
是Python中的賦值嗜历,tensorflow函數(shù)的操作會(huì)新建一個(gè)節(jié)點(diǎn),如果用Python的=
那么就相當(dāng)于將變量的引用給到這個(gè)新節(jié)點(diǎn)上奥邮,但是在計(jì)算圖上并沒(méi)有相應(yīng)的賦值操作節(jié)點(diǎn)(因?yàn)橹皇莗ython對(duì)于等式右邊節(jié)點(diǎn)的一個(gè)引用而已)腥光,而如果使用tf.assign
的話計(jì)算圖中有賦值節(jié)點(diǎn)。 - 你只要分清哪些是
tensorflow
中的操作和哪些是python
語(yǔ)言的引用操作阳掐,就能分清哪些是在建圖始衅,哪些只是在改變引用。
第一個(gè)例子:因?yàn)閛p是tensorflow中的一個(gè)結(jié)點(diǎn)缭保,而assign_add是對(duì)原始的節(jié)點(diǎn)a進(jìn)行賦值汛闸,所以最終的結(jié)果是7。
a = tf.Variable(3)
op = tf.assign_add(a,1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(op)
sess.run(op)
sess.run(op)
sess.run(op)
print(sess.run(a))
>>7
第二個(gè)例子:注意a = a + 1
的實(shí)際操作是首先將右邊a
的節(jié)點(diǎn)加上1艺骂,這是一個(gè)新建節(jié)點(diǎn)操作诸老,a+1
返回的是這個(gè)新建節(jié)點(diǎn),此時(shí)a = 新建節(jié)點(diǎn)
钳恕。也就是a引用的節(jié)點(diǎn)地址從變量a變成了a+1操作符的引用别伏,我們打印出來(lái)可以看到,此時(shí)的a是一個(gè)add操作
苞尝。這是run(a)
就不會(huì)修改原始節(jié)點(diǎn)name="a"
的值畸肆,也就是始終為1
,也就是關(guān)鍵問(wèn)題是在計(jì)算圖上沒(méi)有給原始的變量a進(jìn)行賦值宙址,所以他的值始終是1轴脐,加了1以后add操作符打印出來(lái)是2。
a = tf.Variable(3)
a = a + 1
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(a)
sess.run(a)
sess.run(a)
sess.run(a)
print(a)
print(sess.run(a))
>>Tensor("add:0", shape=(), dtype=int32)
4