用于定义创建变量(层)的ops的上下文管理器。这个上下文管理器验证(可选的)值来自同一个图,确保图是默认图,并推入名称范围和变量范围。如果name_or_scope不为None,则按原样使用。如果name_or_scope为None,则使用default_name。在这种情况下,如果以前在相同的范围中使用过相同的名称,则通过在名称后面附加_N使其惟一。变量作用域允许您创建新变量并共享已创建的变量,同时提供检查以防止意外创建或共享。
如何创建一个新变量的简单例子:
with tf.variable_scope("foo"):
with tf.variable_scope("bar"):
v = tf.get_variable("v", [1])
assert v.name == "foo/bar/v:0"
共享一个变量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
重用共享变量的基本例子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
通过捕获范围和设置重用共享一个变量:
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 ...").
请注意重用标志是继承的:如果我们打开一个重用范围,那么它的所有子范围也将成为重用。关于名称范围的说明:设置重用不会影响mult等其他操作的命名。
请注意,在1.0版本之前和包括1.0版本之前,允许(尽管明确地不鼓励)将False传递给重用参数,从而产生了与None略有不同的无文档化行为。从1.1.0开始传递None和False,因为重用具有完全相同的效果。关于在多线程环境中使用变量作用域的注意事项:变量作用域是线程本地的,因此一个线程不会看到另一个线程的当前作用域。此外,当使用default_name时,仅在每个线程的基础上生成惟一的范围名。如果在不同的线程中使用了相同的名称,这并不会阻止新线程创建相同的作用域。但是,底层变量存储是跨线程共享的(在同一个图中)。因此,如果另一个线程试图创建一个与前一个线程创建的变量同名的新变量,那么它将失败,除非重用为真。
此外,每个线程都以一个空变量范围开始。因此,如果希望从主线程的范围中保留名称前缀,应该捕获主线程的范围并在每个线程中重新输入它,如:
main_thread_scope = variable_scope.get_variable_scope()
# Thread's target function:
def thread_target_fn(captured_scope):
with variable_scope.variable_scope(captured_scope):
# .... regular code for this thread
thread = threading.Thread(target=thread_target_fn, args=(main_thread_scope,))
Methods
__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
)
初始化上下文管理器。
参数:
caching_device
: 此范围内变量的默认缓存设备。partitioner
: 此范围内变量的默认分区程序。reuse
: True、None或tf.AUTO_REUSE;如果为真,则进入此范围以及所有子范围的重用模式;如果特遣部队。AUTO_REUSE,如果变量不存在,我们创建变量,否则返回;如果没有,则继承父范围的重用标志。当启用了即时执行时,这个参数总是强制为tf.AUTO_REUSE。constraint
: 优化器更新后应用于变量的可选投影函数(例如,用于为层权重实现规范约束或值约束)。函数必须将表示变量值的未投影张量作为输入,并返回投影值的张量(其形状必须相同)。在进行异步分布式培训时使用约束并不安全。返回值:
异常:
__enter__
ValueError
: when trying to reuse within a create scope, or create within a reuse scope.TypeError
: when the types of some arguments are not appropriate.__enter__()
__exit__
__exit__(
type_arg,
value_arg,
traceback_arg
)
原链接: https://tensorflow.google.cn/versions/r1.9/api_docs/python/tf/variable_scope?hl=en