tf中的scope探索,以及tf.variable_scope和 tf.VariableScope的关系和区别

“with tf.variable_scope("scope_name") as vs:”

上面这句是我们最常用的语句之一,用来定义一个域,以方便对变量进行操作,tf.variable_scope("scope_name") 会得到一个variable_scope的类。

但是,如果我们用函数tf.get_variable_scope() 来获取当前域。会得到一个VariableScope类

yyy = tf.variable_scope('scope_name')
print(yyy)
sss = tf.get_variable_scope()
print(sss)

结果:
<tensorflow.python.ops.variable_scope.variable_scope object at 0x7f92b96cb780>
<tensorflow.python.ops.variable_scope.VariableScope object at 0x7f92b96cbdd8>

这2个明显不是一个同一种类。那么他们的关系是什么呢?

这要从最一开始的“with tf.variable_scope("scope_name") as vs: ”说起

我们知道with的用法是调用with后面的对象的__enter__()方法,如果有as语句,则将__enter__()的返回结果赋予as后面的变量,即vs。

我们打印出vs就会发现,vs的类型恰恰是<tensorflow.python.ops.variable_scope.VariableScope object at 0x7f92b96cbdd8>

with tf.variable_scope("scope_name") as vs:
    print(vs)

结果:
<tensorflow.python.ops.variable_scope.VariableScope object at 0x7f92b96cbdd8>

因此我们可以得到结论:

variable_scope.__enter__() == VariableScope

再进一步引申,我们平时所用到的域,其实是VariableScope。VariableScope对象中包含了这个域中的所有variable,collection等等各种属性和方法,详见https://www.tensorflow.org/api_docs/python/tf/compat/v1/VariableScope。VariableScope有一个属性name,如果我们想要切换进某个VariableScope,通过tf.variable_scope("scope_name") 可以找到这个VariableScope,然后通过__enter__()方法切换进这个scope。所以tf.variable_scope可以理解成通过VariableScope的name值寻找VariableScope的反射。

我们再进一步引申:

scope的结构是什么样的呢?

我们都知道如果用:

with tf.variable_scope("scope_name1") as vs1:
    with tf.variable_scope("scope_name2") as vs2:

会创建一个scope_name1/scope_name2 的域,即我们可以把域看作一个集合,父域的属性会影响到子域。例如我们对父域使用tf.get_variable_scope().reuse_variables()。则会使得子域也全都处于reuse的状态。

而所有域的父域全都是一个无名域,这个无名域的name=''。是在创建graph的时候生成的。因此,如果我们在最外层写了tf.get_variable_scope().reuse_variables(),则对所有的域都会生效

### 回答1: tf.compat.v1.variable_scopeTensorFlow的一个上下文管理器,用于管理变量的命名空间。它可以帮助我们更好地组织和管理变量,避免变量名冲突等问题。在TensorFlow 2.variable_scope已经被tf.keras.layers的Layer类所取代,但在旧版本仍然可以使用。 ### 回答2: tf.compat.v1.variable_scopeTensorFlow的一个函数,用于定义一个可重用的变量作用域。在TensorFlow,变量作用域主要用于管理变量的命名和共享。 使用tf.compat.v1.variable_scope可以创建一个变量作用域,可以在其定义和共享变量。通过给变量作用域命名,可以有效地对变量进行分组和组织。 变量作用域提供了多种功能: 1. 命名管理:可以通过给变量作用域命名,为其的变量统一添加一个前缀,并自动命名变量的名称,避免了手动为每个变量命名的繁琐操作。 2. 变量共享:可以通过tf.compat.v1.get_variable函数在不同的变量作用域共享变量。当需要共享变量时,只需要在所需的作用域使用相同的名称创建变量即可。 3. 作用域嵌套:可以在一个变量作用域嵌套另一个变量作用域。内部作用域的名称会与外部作用域的名称进行拼接,创建出更具层次感的变量命名。 4. 控制变量的重用:在同一个变量作用域,可以通过设置reuse=True来控制是否重用之前创建的变量。这对于定义循环神经网络等需要多次调用相同变量的任务非常有用。 综上所述,tf.compat.v1.variable_scopeTensorFlow非常有用的工具函数,用于管理变量的命名和共享。通过变量作用域,可以更好地组织和管理代码的变量,并提高代码的可读性和复用性。 ### 回答3: tf.compat.v1.variable_scopeTensorFlow v1版本的一个变量作用域管理器。它主要用于管理变量的命名空间。 在TensorFlow,变量作用域管理器tf.compat.v1.variable_scope可用于给变量的名称添加前缀。通过使用变量作用域,可以将相关的变量分组并命名,使得变量的名称更加清晰和具有可读性。 在变量作用域内,可以通过tf.compat.v1.get_variable函数来创建或共享变量。get_variable函数会根据变量作用域的名称和变量的名称自动命名或共享变量。这种方式可以帮助我们避免在多次调用函数时重复创建同名的变量,从而导致命名冲突的问题。 变量作用域还支持嵌套,可以创建多个层次的变量作用域来更好地管理变量。在嵌套的变量作用域内,如果变量名称相同,TensorFlow会自动在变量名称后面添加数字来进行区分。 使用变量作用域的一个主要优势是可以通过tf.compat.v1.get_variabletf.compat.v1.variable_scope配合使用完成变量共享的功能。通过在不同的变量作用域下使用相同名称的变量,可以实现变量的共享。这在构建大型神经网络时非常有用,可以方便地共享参数,减少内存占用和计算量。 总之,tf.compat.v1.variable_scopeTensorFlow v1版本的一个变量作用域管理器,它可以帮助我们更好地组织和管理变量的命名,并实现变量的共享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值