1. 程式人生 > >tf.identity的作用

tf.identity的作用

還是從一個例子開始講起

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)#對x進行加1操作
#tf.control_dependencies的作用是:在執行y=x前,先執行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())

這個程式碼的輸出和我們想象的不一樣,他的輸出是0, 0, 0, 0, 0

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

這段程式碼的輸出才是1, 2, 3, 4, 5

其實這裡的tf.identity的作用相當於一個reference,也就是y僅僅是一個x的別名,這兩個變數使用的是一塊記憶體,而對於y=xxy在不同的記憶體中

這裡舉一個經典的例子

這裡的swap1就相當於沒有加tf.identity的做法,而swap2就相當於加了tf.identity的做法。

雖然y=x這樣做了,但是這裡的y可以了理解為上面swap1中的y,他僅僅是一個區域性變數,函式結束,這塊記憶體就釋放了。如果添加了tf.identity,也就是說,y相當於一個全域性變數xreference,修改x自然會修改y

上面的論述存在一些問題,謝謝JepsonWong的指出。我後來去查看了tensorflow

的原始碼,發現

void TF_ImportGraphDefOptionsAddReturnOutput(TF_ImportGraphDefOptions* opts,
…   
      for (const tensorflow::Operation& op : control_deps) {
        opts.control_dependencies.push_back(op.node()->name());
      }

實際上,這裡tf.control_dependencies在呼叫時,就是將tensorflow::Operation物件插入到opts連結串列裡面。然而y = x操作不是一個tensorflow::Operation物件,所以第一個tf.control_dependencies並不會做插入操作。

tf.identity的作用實際上,是將CPU操作轉化為GPU操作,也就是一個tensorflow::Operation物件。具體上是說,identity返回了一個Output型別,而Output又是一種Operation

當然這是我的理解,可能有不對之處,歡迎大家指出!