1. 程式人生 > >tf.identity的意義以及用例

tf.identity的意義以及用例

下面程式的功能是,做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就會生效,所以第二種情況的輸出符合預期。