前言:最近做一個實驗,遇到TensorFlow變量作用域問題,對tf.name_scope()、tf.variable_scope()等進行了較為深刻的比較,記錄相關筆記: tf.name_scope()、tf.variable_scope()是兩個作用域函數,一般與兩個創建/調用變量的函數tf.variable() 和tf.get_variable()搭配使用。常用於: 1)變量共享;2)tensorboard畫流程圖進行可視化封裝變量。 通俗理解就是:tf.name_scope()、tf.variable_scope()會在模型中開辟各自的空間,而其中的變量均在這個空間內進行管理,但是之所以有兩個,主要還是有着各自的區別。 1.name_scope 和 variable_scope: name_scope 和 variable_scope主要用於變量共享。其中,變量共享主要涉及兩個函數:tf.variable() 和tf.get_variable();即就是必須要在tf.variable_scope的作用域下使用tf.get_variable()函數。這里用tf.get_variable( ) 而不用tf.Variable( ),是因為前者擁有一個變量檢查機制,會檢測已經存在的變量是否設置為共享變量,如果已經存在的變量沒有設置為共享變量,TensorFlow 運行到第二個擁有相同名字的變量的時候,就會報錯。 注意,tf.variable() 和tf.get_variable()有不同的創建變量的方式:tf.Variable() 每次都會新建變量。如果希望重用(共享)一些變量,就需要用到了get_variable(),它會去搜索變量名,有就直接用,沒有再新建。此外,為了對不同位置或者范圍的共享進行區分,就引入名字域。既然用到變量名了,就涉及到了名字域的概念。這就是為什么會有scope 的概念。name_scope 作用域操作,variable_scope 可以通過設置reuse 標志以及初始化方式來影響域下的變量,因為想要達到變量共享的效果, 就要在 tf.variable_scope()的作用域下使用 tf.get_variable() 這種方式產生和提取變量. 不像 tf.Variable() 每次都會產生新的變量, tf.get_variable() 如果遇到了已經存在名字的變量時, 它會單純的提取這個同樣名字的變量,如果不存在名字的變量再創建. 例如:
2.name scope和variable scope區別 TF中有兩種作用域類型:命名域 (name scope),通過tf.name_scope 或 tf.op_scope創建; 變量域 (variable scope),通過tf.variable_scope 或 tf.variable_op_scope創建; 這兩種作用域,對於使用tf.Variable()方式創建的變量,具有相同的效果,都會在變量名稱前面,加上域名稱。對於通過tf.get_variable()方式創建的變量,只有variable scope名稱會加到變量名稱前面,而name scope不會作為前綴。 舉例1:
舉例2:
總結: 1、name_scope不會作為tf.get_variable變量的前綴,但是會作為tf.Variable的前綴。(舉例1) 2、在variable_scope的作用域下,tf.get_variable()和tf.Variable()都加了scope_name前綴。因此,在tf.variable_scope的作用域下,通過get_variable()可以使用已經創建的變量,實現了變量的共享,即可以通過get_variable()在tf.variable_scope設定的作用域范圍內進行變量共享。(舉例2) 3、在重復使用的時候, 一定要在代碼中強調 scope.reuse_variables()
參考鏈接: [1] scope 命名方法 - Tensorflow | 莫煩Python [2] tf.name_scope()和tf.variable_scope() - AI-FUTURE - CSDN博客 |
|