前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tf.variable_scope

tf.variable_scope

作者头像
狼啸风云
修改2022-09-04 20:57:53
1.9K0
修改2022-09-04 20:57:53
举报

用于定义创建变量(层)的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
)

初始化上下文管理器。

参数:

  • name_or_scope: string或VariableScope:要打开的范围。
  • default_name: 如果name_or_scope参数为None,则使用的默认名称将被统一。如果提供了name_or_scope,则不会使用它,因此它不是必需的,也可以是None。
  • value: 传递给op函数的张量参数列表。
  • initializer: 此范围内变量的默认初始化器。
  • caching_device: 此范围内变量的默认缓存设备。
  • partitioner: 此范围内变量的默认分区程序。
  • custom_getter: 此范围内变量的默认自定义getter。
  • reuse: True、None或tf.AUTO_REUSE;如果为真,则进入此范围以及所有子范围的重用模式;如果特遣部队。AUTO_REUSE,如果变量不存在,我们创建变量,否则返回;如果没有,则继承父范围的重用标志。当启用了即时执行时,这个参数总是强制为tf.AUTO_REUSE。
  • dtype: 在此范围中创建的变量的类型(默认为传递的范围中的类型,或从父范围继承的类型)。
  • use_resource: 如果为False,则所有变量都是常规变量。如果为真,则使用具有定义良好语义的实验性资源变量。默认值为False(稍后将更改为True)。当启用紧急执行时,该参数总是强制为真。
  • constraint: 优化器更新后应用于变量的可选投影函数(例如,用于为层权重实现规范约束或值约束)。函数必须将表示变量值的未投影张量作为输入,并返回投影值的张量(其形状必须相同)。在进行异步分布式培训时使用约束并不安全。
  • auxiliary_name_scope:如果为真,则使用该范围创建一个辅助名称范围。如果为False,则不触及name作用域。

返回值:

  • 可以捕获和重用的范围。

异常:

__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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档