在深度学习的训练过程中,为了减少训练参数数量,或是在不同计算机上并行运算,我们往往需要共享变量。Tensorflow中的变量共享主要是通过tf.variable_scope和tf.variable来实现。
tf.variable_scope()主要是对于图中大量变量进行批量化管理,域内的变量会被加上同一个前缀名,同时该函数还会自动生成一个同名name_scope(),故域内节点也会加上此前缀。因为同名的变量在运行时会报错,所以此方法减小了命名的麻烦,并让整个graph的变量和节点显得很有层次感。在variable_scope下,我们可以创建新的变量,也可以通过设置reuse参数允许使用已有的变量,具体来说都是通过tf.get_variable()来实现的。
tf.variable_scope(name_or_scope, reuse=None,initializer=None)
我们可以看到,这个函数有3个形参:name_or_scope为域内所有变量指定同一个前缀,reuse设定是否需要重用域内的变量(默认是False所以如果用到了变量重用需要专门设置为True),initializer为域内所有变量指定了初始化方法。
在tf.variable_scope()下创建变量的例子:
with tf.variable_scope("foo"): with tf.variable_scope("bar"):v = tf.get_variable("v", [1]) assert v.name == "foo/bar/v:0"
在tf.variable_scope()下重用变量的例子:
with tf.variable_scope("foo"):v = tf.get_variable("v", [1])
with tf.variable_scope("foo",reuse=True): v1 = tf.get_variable("v", [1])
assert v1 == v
同样都是建立变量,tf.Variable()每次调用时都会建立新的变量,而tf.get_variable()在tf.variable_scope()指定了reuse模式时,会先根据变量名搜索已有的变量,如果发现了就可拿来用,从而实现变量的共享。