通俗理解tf.name_scope()、tf.variable_scope()


前言:最近做一個實驗,遇到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() 如果遇到了已經存在名字的變量時, 它會單純的提取這個同樣名字的變量,如果不存在名字的變量再創建.
例如:
  1. [/code]輸出:
  2. [code]
復制代碼
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:
  1. [/code]輸出:
  2. [code]
復制代碼
舉例2:
  1. [/code]輸出:
  2. [code]
復制代碼
總結:
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博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM