轉載自: https://blog.csdn.net/qq_41058594/article/details/85165025
在學習Tensorflow進階實例這本書時候出現了tf.variable_scope,當時很蒙圈,現在就來總結一下:
tf.variable_scope函數
variable_scope類
用於定義創建變量(層)的操作的上下文管理器。
此上下文管理器驗證(可選)values是否來自同一圖形,確保圖形是默認的圖形,並推送名稱範圍和變量範圍。
如果name_or_scope不是None,則使用as is。如果scope是None,則使用default_name。在這種情況下,如果以前在同一範圍內使用過相同的名稱,則通過添加_N來使其具有唯一性。
變量範圍允許您創建新變量並共享已創建的變量,同時提供檢查以防止意外創建或共享。在本文中我們提供了幾個基本示例。
示例1-如何創建一個新變量:
with tf.variable_scope("foo"):
with tf.variable_scope("bar"):
v = tf.get_variable("v", [1])
assert v.name == "foo/bar/v:0"
示例2-共享變量AUTO_REUSE:
def foo():
with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
v = tf.get_variable("v", [1])
return v
v1 = foo() # Creates v.
v2 = foo() # Gets the same, existing v.
assert v1 == v2
示例3-使用reuse=True共享變量:
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True):
v1 = tf.get_variable("v", [1])
assert v1 == v
示例4-通過捕獲範圍並設置重用來共享變量:
with tf.variable_scope("foo") as scope:
v = tf.get_variable("v", [1])
scope.reuse_variables()
v1 = tf.get_variable("v", [1])
assert v1 == v
爲了防止意外共享變量,我們在獲取非重用範圍中的現有變量時引發異常。
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
v1 = tf.get_variable("v", [1])
# Raises ValueError("... v already exists ...")
同樣,我們在嘗試獲取重用模式中不存在的變量時引發異常。
with tf.variable_scope("foo", reuse=True):
v = tf.get_variable("v", [1])
# Raises ValueError("... v does not exists ...")
請注意,reuse(重用)標誌是有繼承性的:如果我們打開一個重用範圍,那麼它的所有子範圍也會重用。
關於名稱範圍的說明:設置reuse不會影響其他操作(如多重)的命名。
請注意,1.0版本開始(包含)允許(雖然明確勸阻)將False傳遞給重用參數,從而產生與None無關的未記錄行爲。從1.1.0版本開始傳遞None和False作爲重用具有完全相同的效果。
方法
init
__init__(
name_or_scope,
default_name=None,
values=None,
initializer=None,
regularizer=None,
caching_device=None,
partitioner=None,
custom_getter=None,
reuse=None,
dtype=None,
use_resource=None,
constraint=None,
auxiliary_name_scope=True
)
用於初始化上下文管理器。
參數:
- name_or_scope:string或者VariableScope表示打開的範圍。
- default_name:如果name_or_scope參數爲None,則使用默認的名稱,該名稱將是唯一的;如果提供了name_or_scope,它將不會被使用,因此它不是必需的,並且可以是None。
- values:傳遞給操作函數的Tensor參數列表。
- initializer:此範圍內變量的默認初始值設定項。
- regularizer:此範圍內變量的默認正規化器。
- caching_device:此範圍內變量的默認緩存設備。
- partitioner:此範圍內變量的默認分區程序。
- custom_getter:此範圍內的變量的默認自定義吸氣。
- reuse:可以是True、None或tf.AUTO_REUSE;如果是True,則我們進入此範圍的重用模式以及所有子範圍;如果是tf.AUTO_REUSE,則我們創建變量(如果它們不存在),否則返回它們;如果是None,則我們繼承父範圍的重用標誌。當啓用緊急執行時,該參數總是被強制爲tf.AUTO_REUSE。
dtype:在此範圍中創建的變量類型(默認爲傳入範圍中的類型,或從父範圍繼承)。 - use_resource:如果爲false,則所有變量都將是常規變量;如果爲true,則將使用具有明確定義的語義的實驗性
ResourceVariables。默認爲false(稍後將更改爲true)。當啓用緊急執行時,該參數總是被強制爲true。 - constraint:一個可選的投影函數,在被Optimizer(例如用於實現層權重的範數約束或值約束)更新之後應用於該變量。該函數必須將代表變量值的未投影張量作爲輸入,並返回投影值的張量(它必須具有相同的形狀)。進行異步分佈式培訓時,約束條件的使用是不安全的。
- auxiliary_name_scope:如果爲True,則我們用範圍創建一個輔助名稱範圍;如果爲False,則我們不接觸名稱範圍。
返回值:
返回可以捕獲和重用的範圍。
可能引發的異常:
- ValueError:在創建範圍內嘗試重用時,或在重用範圍內創建時。
- TypeError:某些參數的類型不合適時。