tf.identity的意義以及用例
阿新 • • 發佈:2019-02-08
下面程式的功能是,做5次迴圈,每次迴圈給x加1,賦值給y,然後打印出來,所以我們預期達到的效果是輸出2,3,4,5,6。
x = tf.Variable(1.0)
y = tf.Variable(0.0)
#返回一個op,表示給變數x加1的操作
x_plus_1 = tf.assign_add(x, 1)
#control_dependencies的意義是,在執行with包含的內容(在這裡就是 y = x)前,
#先執行control_dependencies引數中的內容(在這裡就是 x_plus_1),這裡的解釋不準確,先接著看。。。
with tf.control_dependencies([x_plus_1]):
y = x
init = tf.initialize_all_variables()
with tf.Session() as session:
init.run()
for i in xrange(5):
print(y.eval())#相當於sess.run(y),按照我們的預期,由於control_dependencies的作用,所以應該執行print前都會先執行x_plus_1,但是這種情況會出問題
這個列印的是1,1,1,1,1 。可以看到,沒有達到我們預期的效果,y只被賦值了一次。
如果改成這樣:
x = tf.Variable(1.0)
y = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
y = tf.identity(x)#修改部分
init = tf.initialize_all_variables()
with tf.Session() as session:
init.run()
for i in xrange(5):
print(y.eval())
這時候列印的是2,3,4,5,6
解釋:對於control_dependencies這個管理器,只有當裡面的操作是一個op時,才會生效,也就是先執行傳入的引數op,再執行裡面的op。而y=x僅僅是tensor的一個簡單賦值,不是定義的op,所以在圖中不會形成一個節點,這樣該管理器就失效了。tf.identity是返回一個一模一樣新的tensor的op,這會增加一個新節點到gragh中,這時control_dependencies就會生效,所以第二種情況的輸出符合預期。