在 tensorflow 中,我們知道要先建立好 tensor 和 operation 後,再透過 session 來執行,而在 training 時,若有使用了像 batch normalization 這類的運算時,我們在更新權重時就有順序的考量,如果你非常希望某 operation 執行前,你一定要先執行另一個 operation 時,你就可以考慮使用 control_dependencies 來達成目的。
要使用 control_dependencies 的語法很簡單,如下。
with tf.control_dependencies(<要先被執行的op>):
<之後再執行的op>
這邊用一個範例來解釋。
v = tf.get_variable(name="variable", shape=(), initializer=tf.constant_initializer(0))
add_op = tf.assign_add(v, 3)
with tf.control_dependencies([add_op]):
mul_op = tf.multiply(v, 10)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
result = sess.run(mul_op)
print(result)
我們先創建一個 variable 起始值為0,然後定一個 op 對 variable 加3,再使用 control_dependencies 設定 mul_op 依賴於 add_op,意思等同要執行 mul_op 之前,必須先執行 add_op ,其印出結果:
沒錯,我們就得到 30 這個數字,(0+3)* 10 = 30。
而當我們用 tensorboard 的圖表來判讀時,可以看到 Mul 節點有個來自 AssignAdd 的虛線箭頭,這就是control_dependencies 所產生的結果,而橘色箭頭是他引用的值,意義類似 call by reference 會對箭頭來源的值做變動!
今天的內容雖然簡單但是卻非常重要喔,後面會再多加介紹如何結合 control_dependencies 來更新 batch normalization。