Tensorflow学习笔记——计算图的使用

结合实战Google深度学习框架,补充自己的注释理解。

Tensorflow 计算图的使用

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) )

结果:

[ 0.72317421]

你可能感兴趣的:(TensorFlow)