在tensorflow学习之路(2-1):tf.variable_scope(),tf.name_scope(),tf.get_variable()的认识这篇中,并没有对他们有一个很好的认识,仅仅介绍了他们的使用。而在这篇文章中,将会重新从整体上去理解他们,算是对上篇的一个更好的总结吧。
简要概括:我们可以通过tf.Variable()来新建变量,但是,在tensorflow程序中,我们又需要共享变量(share variables),于是,就有了tf.get_variable()(新建变量或者取已经存在的变量)。但是,因为一般变量命名比较短,那么,此时,我们就需要类似目录工作一样的东西来管理变量命名,于是,就有了tf.variable_scope(),同时,设置reuse标志,就可以来决定tf.get_variable()的工作方式(新建变量或者取得已经存在变量)。此外,在tensorflow中,还存在ops操作,而tf.variable_scope()可以同时对variable和ops的命名有影响,即加前缀;而tf.name_scope()只能对ops的命名加前缀。
先介绍背景:
在简单的模型中,我们可以创建多个variable。而在复杂的模型中,我们往往需要共享大量的variables,且需要在同一位置初始化他们。因此,出现了tf.variable_scope()和tf.get_variable()。
一般可以通过使用dictionary也可以达到共享变量的目的,但是,其在代码外创建变量打破了封装原则,同时,当代码改变时,需要创建更多或者更少或者新建变量。
在tensorflow中的Variable Scope Mechanism 主要包含了下面两个函数:
- tf.get_variable()
- tf.variable_scope()
tf.get_variable()主要用于得到或者新建一个variable变量,而不是直接调用tf.Variable().于tf.Variable()之间使用值初始化变量不同,tf.get_variable()主要是通过initializer这个function来初始化新建变量的。此外,variable变量名字较短,容易重复,所以,就需要tf.variable_scope()为变量创建一个命名空间。例如,cnn的每一层中,均有weights和biases这两个变量,通过tf.variable_scope()为每一卷积层命名,就可以防止变量name重复。
Variable Scope是如何工作的呢?
首先,理解tf.get_variable()是如何工作的。一般通过下面方式调用tf.get_variable():
v = tf.get_variable(name, shape, dtype, initializer)
而tf.get_variable()是新建变量还是取得已存在变量取决于调用它的scope.
情况1:若scope设置为新建变量,例如,tf.get_variable_scope().reuse == False.(说明:tf.get_variable_scope()得到当前的scope)