import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
#在计算图g1中定义变量"v",并设置初始值为0
v = tf.get_variable("v", initializer = tf.zeros_initializer()(shape = [1]))
# v = tf.get_variable("v", shape=[1], initializer = tf.zeros_initializer()) 两种方式都可以
#Signature: tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, custom_getter=None)
#Docstring:
#Gets an existing variable with these parameters or create a new one.
#initializer=tf.zeros_initializer(shape=[1])更新后改为:initializer = tf.zeros_initializer()(shape = [1])
g2 = tf.Graph()
with g2.as_default():
v = tf.get_variable("v", initializer = tf.ones_initializer()(shape = [1]))
g3 = tf.Graph()
with g3.as_default():
v = tf.get_variable("v", shape = [1], initializer=tf.constant_initializer(0.8))
#常量初始化
with tf.Session(graph=g1) as sess:
sess.run(tf.global_variables_initializer())
#tf.initialize_all_variables 被tf.global_variables_initializer更新了
with tf.variable_scope("",reuse = True): #“”: name_or_scope存在就用已有的,否则用默认的“”
#将参数reuse设置为True.这样tf.get_variable函数将直接获取已经声明的变量
#使用reuse=None或者reuse=False创建上下文管理器时,tf.get_variable操作将创建新的变量
print(sess.run(tf.get_variable("v")))
with tf.Session(graph=g2) as sess:
sess.run(tf.global_variables_initializer())
with tf.variable_scope("",reuse = True):
print(sess.run(tf.get_variable("v")))
with tf.Session(graph=g3) as sess:
sess.run(tf.global_variables_initializer())
with tf.variable_scope("",reuse=True):
print(sess.run(tf.get_variable("v")))
结果:
[ 0.]
[ 1.]
[ 0.80000001]
变量命名空间
import tensorflow as tf
with tf.variable_scope("foo"):
#先通过tf.variable_scope函数生成一个上下文管理器,在管理器里定义变量,命名空间为"foo"
v = tf.get_variable("v", shape = [1], initializer=tf.constant_initializer(1.0))
with tf.variable_scope("foo",reuse=True): #reuse=True,这个参数的设置将使tf.get_variable获取已生成的变量,
#若变量不存在,将会报错。reuse 参数默认为False,即f.get_variable将创建新的变量
v1 = tf.get_variable("v",[1])
print(v1==v)
with tf.variable_scope("001"):
print(tf.get_variable_scope().reuse)
#tf.get_variable_scope().reuse函数将获取当前上下文管理器中的reuse参数,此处未定义reuse值则为False
with tf.variable_scope("002", reuse=True):
print(tf.get_variable_scope().reuse) #此处指定reuse的值为True
with tf.variable_scope("003"): #新建一个嵌套的上下文管理器,但是不指定reuse的值,此时的reuse将和外层reuse参数保持一致
print(tf.get_variable_scope().reuse)
print(tf.get_variable_scope().reuse) #重新返回最外层管理器,打印最外层管理器的reuse参数 应为False
结果:
True
False
True
True
False
命名空间嵌套
with tf.variable_scope("foo"):
v = tf.get_variable("v",[1])
print(v.name)
# 命名空间可以嵌套;下面结果0表示这个变量是生成变量这个运算的第一个结果
结果:
foo/v:0
获取其他命名空间的变量
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
with tf.variable_scope("",reuse=True): #创建一个名称为空的命名空间,
v1 = tf.get_variable("foo/v",[1]) #可直接通过带命名空间名称的变量名来获取其他命名空间下的变量
print(sess.run(v1) )