【Tensorflow】tf.variable_scope函數

轉載自: 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:某些參數的類型不合適時。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章