1、tensorflow提供了通过变量名称来创建或获取一个变量的机制。通过这个机制,在不同的函数中可以直接使用变量的名称来使用变量,而不需要将变量通过参数的形式到处传递。
2、tensorflow中获取变量主要是通过tf.get_variable和tf.variable_scope函数实现的。
#下面这两个定义是等价的
v = tf.get_variable("v", shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0,shape=[1], name="v")
**tf.get_variable函数和tf.Variable函数最大的区别在于指定变量名称的参数,对于tf.Variable函数,变量名称是一个可选的参数,通常以name=”v”的形式给出。但对于tf.get_variable函数,变量名称是一个必填的参数。tf.get_variable函数会根据这个名字去创建或者获取变量。
3、如果需要通过tf.get_variable获取一个已经创建的变量,需要通过tf.variable_scope函数来生成一个上下文管理器,并明确指定在这个上下文管理中,tf.get_variable将直接获取已经生成的变量。
#在名字为"foo"的命名空间里创建名字为“v”的变量
with tf.variable_scope("foo"):
v = get_variable("v", [1], initializer=tf.constant_initializer(1.0))
#因为在命名空间里已经存在名字为“v”的变量所以以下代码会报错
with tf.variable_scope("foo"):
v = get_variable("v", [1])
#在生成的上下文管理器时,将参数reuse设置为True。这样tf.get_variable函数将直接获取已经生明的变量
with tf.variable_scope("foo", reuse=True):
v = get_variable("v", [1])
print v==v1 #输出true,代表v, v1是相同的tensorflow中的变量
#将参数reuse设置为true时,tf.variable_scope将只能获取已经创建过的变量,因为在命名空间bar中还没有创建变量v,所以下面代码将会报错
with tf.variable_scope("bar", reuse=True):
v = tf.get_variable("v", [1])
4、Tensorflow中的tf.variable_scope函数是可以嵌套的,当新建一个嵌套的上下文管理器但不指定reuse,这时reuse的取值会和外面一层保持一致。
5、tf.variable_scope函数生成的上下文管理器也会创建一个tensorflow中的命名空间,在这个命名空间内创建的变量名称都会带上这个命名空间名作为前缀。所以tf.variable_scope函数除了可以控制tf.get_variable执行的功能之外,也提供了一个管理变量命名空间的方式。
v1 = tf.get_variable("v", [1])
print v1.name #输出v:0. "v"为变量的名称,“:0”表示这个变量是生成变量这个运算的第一个结果
with tf.variable_scope("foo"):
v2 = tf.get_variable("v", [1])
print v2.name #输出foo/v:0. 其中/用来分隔命名空间和变量的名称
with tf.variable_scope("foo"):
with tf.variable_scope("bar"):
v3 = get_variable("v", [1])
print v3.name #输出 foo/bar/v . 命名空间可以嵌套
#创建一个空的命名空间,并设置reuse=true
with tf.variable_scope("",reuse=True):
v5 = get_variable("foo/bar/v", [1])
print v5 == v3 #输出True