我一直在阅读他们编写的张量流教程
with tf.name_scope('read_inputs') as scope:
<insert code here>
我怀疑为什么我们使用name_scope?
1) a = tf.constant(5)
2) with tf.name_scope('s1') as scope:
a = tf.constant(5)
1)和2)都是一回事。那么什么时候使用name_scope创造差异?
答案 0 :(得分:16)
他们不是一回事。
import tensorflow as tf
c1 = tf.constant(42)
with tf.name_scope('s1'):
c2 = tf.constant(42)
print(c1.name)
print(c2.name)
打印
Const:0
s1/Const:0
顾名思义,范围函数为您在其中创建的操作的名称创建范围。这会影响你如何引用张量,重用,图表在TensorBoard中的显示方式等等。
答案 1 :(得分:5)
我没有看到重用常量的用例,但这里有一些关于范围和变量共享的相关信息。
<强>作用域强>
name_scope
会将范围添加为所有操作的前缀
variable_scope
会将范围添加为所有变量和操作的前缀
实例化变量
tf.Variable()
constructer前缀变量名称,包含当前name_scope
和variable_scope
tf.get_variable()
构造函数会忽略name_scope
,并且仅使用当前variable_scope
例如:
with tf.variable_scope("variable_scope"):
with tf.name_scope("name_scope"):
var1 = tf.get_variable("var1", [1])
with tf.variable_scope("variable_scope"):
with tf.name_scope("name_scope"):
var2 = tf.Variable([1], name="var2")
可生产
var1 = <tf.Variable 'variable_scope/var1:0' shape=(1,) dtype=float32_ref>
var2 = <tf.Variable 'variable_scope/name_scope/var2:0' shape=(1,) dtype=string_ref>
重复使用变量
始终使用tf.variable_scope
来定义共享变量的范围
重用变量的最简单方法是使用reuse_variables()
,如下所示
with tf.variable_scope("scope"):
var1 = tf.get_variable("variable1",[1])
tf.get_variable_scope().reuse_variables()
var2=tf.get_variable("variable1",[1])
assert var1 == var2
tf.Variable()
总是会创建一个新变量,当使用已使用的名称构造变量时,它只会向其附加_1
,_2
等 - 这会导致冲突:(< / LI>
答案 2 :(得分:0)
我将尝试使用一些宽松但易于理解的语言进行解释。
名称范围
通常用于在操作中将一些变量组合在一起。也就是说,它为您提供了关于此操作中包含多少个变量的说明。但是,对于这些变量,不考虑它们的存在。您只知道,确定,要完成此操作,我需要准备此,此和此变量。实际上,在使用tensorboard
时,它可以帮助您将变量绑定在一起,因此您的绘图不会混乱。
可变范围
将其作为抽屉考虑。与名称空间相比,这具有更多的“物理”含义,因为这样的抽屉确实存在。相反,名称空间仅有助于了解其中包含哪些变量。
由于变量空间是“物理上”存在的,因此它限制了此变量已经存在,因此您无法再次重新定义它,并且如果要多次使用它们,则需要指出reuse
。