import tensorflow as tf
v=tf.get_variable('v',shape=[1],initializer=tf.constant_initializer(1.0))
print(v)
with tf.variable_scope('foo'):v=tf.get_variable('v',shape=[1],initializer=tf.constant_initializer(1.0))
print(v)
with tf.variable_scope('foo',reuse=True):v1=tf.get_variable('v',[1])
print(v1.name)
print(v1==v)
foo/v:0
True
with tf.variable_scope('foo'):with tf.variable_scope('bar'):v3=tf.get_variable('v',[1])print(v3.name)v4=tf.get_variable('v1',[1])print(v4.name)
foo/bar/v:0
foo/v1:0
with tf.variable_scope('',reuse=True):v5=tf.get_variable('foo/bar/v',[1])print(v5.name)print(v5==v3)v6=tf.get_variable('foo/v1',[1])print(v6.name)
foo/bar/v:0
True
foo/v1:0
综上来看,一个tf的代码,有默认的变量空间,为了更方便地管理变量,可以使用tf.variable_scope来创建相应的变量空间来管理,省去了参数传递的过程。一般来说,第一次创建变量用的是reuse=False,然后再次调用相关变量只需要设置reuse=True,来直接获取该变量空间下的变量,而不需要传递!所以接下来看看改进后的inference.py
def inference(input_tensor,reuse=False):with tf.variable_scope('layer1',reuse=reuse):with tf.variable_scope('layer2,reuse=reuse'): return result
new_y=inference(new_x,True)
最后关于tensorflow变量管理要注意的逻辑:
1.上下文管理器tf.variable_scope的reuse之间若无明确规定,则内外层reuse参数一致;
若规定了外层变量空间reuse为True,则内层reuse也为True,但同层reuse不一定为True。
2.关于这里变量的创建与直接获取过程,均与reuse有关。
3.其次,此处所谓的变量均为张量tensor,不同变量空间中的张量名称不一样,必须要启动会话才实现了真正的赋值
4.代码调试,只能一次性run,重复对同一变量获取或创建,调试会出现变量已经存在的情况,需要充分理解tensorflow变量管理的机制!