tf.identity的作用
阿新 • • 發佈:2019-02-04
還是從一個例子開始講起
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=x
,x
與y
在不同的記憶體中
這裡舉一個經典的例子
這裡的swap1
就相當於沒有加tf.identity
的做法,而swap2
就相當於加了tf.identity
的做法。
雖然y=x這樣做了,但是這裡的y
可以了理解為上面swap1
中的y
,他僅僅是一個區域性變數,函式結束,這塊記憶體就釋放了。如果添加了tf.identity
,也就是說,y
相當於一個全域性變數x
的reference
,修改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
。
當然這是我的理解,可能有不對之處,歡迎大家指出!