函数tf.variable_scope的简单介绍

37 篇文章 1 订阅
4 篇文章 0 订阅

函数tf.variable_scope的简单介绍

经常看到这个函数,所以特地查了一下源码单独记一下。
参考资料

def variable_scope(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)

作用:这个函数返回上下文管理器,用于定义创建变量(或层)的操作。

此上下文管理器验证(可选)values是否来自同一个图,确保该图是默认图,并推送名称作用域和变量作用域。

如果name_or_scope不是None,则按原样使用。如果scope为None,则使用default_name。在这种情况下,如果先前在同一作用域内使用了相同的名称,那么它将被追加_N以保证唯一性。

变量作用域允许创建新变量并共享已创建的变量,同时提供检查以避免意外创建或共享。有关详细信息,请参阅@ {$ variables $ Variable Scope How To}


一些简单和基本的例子。

创建新变量的简单示例:

with tf.variable_scope("foo"):
    with tf.variable_scope("bar"):
        v = tf.get_variable("v", [1])
        assert v.name == "foo/bar/v:0"

共享变量的简单示例

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

通过捕获作用域及设置reuse来共享一个变量:

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])
    #  抛出的异常为 ValueError("... v already exists ...").

同样的,我们在可复用的情况下尝试获取一个不存在的变量的时候会引发一个异常:

with tf.variable_scope("foo", reuse=True):
    v = tf.get_variable("v", [1])
    #  抛出的异常为 ValueError("... v does not exists ...").

请注意,reuse标志具有继承能力:如果我们打开一个重用域,那么它的所有子域也会重用。
关于名称作用域的说明:设置reuse不会影响其他操作(如mult)的命名。相关讨论参见github#6189
注意,直到并包括版本1.0,允许(尽管明确不鼓励)将False传递给reuse参数,从而产生与None略有不同的未记录行为。从1.1.0开始传递None和False,因为重用具有完全相同的效果。

Args:

参数名解释
name_or_scopestring or VariableScope: 待打开的作用域.
default_name如果name_or_scope参数为None,则使用默认名称,此名称将是不加参数的。如果提供了name_or_scope,则不会使用它,因此它不是必需的,可以是None
values传递给op函数的Tensor参数列表。
initializer此作用域内变量的默认初始值。
regularizer用于此作用域内变量的默认正则化器。
caching_device用于此作用域内变量的默认缓存设备。
partitioner用于此作用域内变量的默认分区工具。
custom_getter用于此作用域内变量的默认自定义getter
reuseTrueNone; 如果为True,我们将进入此作用域以及所有子作用域的重用模式;如果None,我们只继承父作用域重用。
dtype在此作用域中创建的变量类型(默​​认为传递进来的作用域中的类型,或从父作用域继承而得)。
use_resource如果为False,则所有变量都将是常规变量。如果为True,则将使用具有明确定义的语义的经验性ResourceVariables。默认为False(更新的版本将更改为True)。

Returns:
可以捕获和重用的作用域。

Raises:
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.

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值