让我们先简短地介绍一下变量共享。它是TensorFlow中的一种机制,允许共享在代码的不同部分访问的变量,而无需传递对变量的引用。
方法tf。Get_variable可以与变量名一起作为参数使用,以创建具有此名称的新变量或检索之前创建的变量。这与使用tf不同。变量构造函数,每次调用它都会创建一个新变量(如果已经存在这样的变量名,则可能会在变量名后面添加一个后缀)。
正是为了实现变量共享机制,引入了一种单独类型的作用域(变量作用域)。
结果,我们得到了两种不同类型的作用域:
名称作用域,使用tf.name_scope创建
变量作用域,使用tf.variable_scope创建
这两个作用域对所有操作以及使用tf创建的变量具有相同的效果。变量,即作用域将作为操作或变量名的前缀添加。
但是,名称作用域被tf.get_variable忽略。我们可以在下面的例子中看到:
with tf.name_scope("my_scope"):
v1 = tf.get_variable("var1", [1], dtype=tf.float32)
v2 = tf.Variable(1, name="var2", dtype=tf.float32)
a = tf.add(v1, v2)
print(v1.name) # var1:0
print(v2.name) # my_scope/var2:0
print(a.name) # my_scope/Add:0
放置使用tf访问的变量的唯一方法。作用域中的Get_variable是使用变量作用域,如下例所示:
with tf.variable_scope("my_scope"):
v1 = tf.get_variable("var1", [1], dtype=tf.float32)
v2 = tf.Variable(1, name="var2", dtype=tf.float32)
a = tf.add(v1, v2)
print(v1.name) # my_scope/var1:0
print(v2.name) # my_scope/var2:0
print(a.name) # my_scope/Add:0
这允许我们轻松地在程序的不同部分共享变量,甚至在不同的名称范围内:
with tf.name_scope("foo"):
with tf.variable_scope("var_scope"):
v = tf.get_variable("var", [1])
with tf.name_scope("bar"):
with tf.variable_scope("var_scope", reuse=True):
v1 = tf.get_variable("var", [1])
assert v1 == v
print(v.name) # var_scope/var:0
print(v1.name) # var_scope/var:0
更新
从r0.11版本开始,op_scope和variable_op_scope都已弃用,并被name_scope和variable_scope所取代。