1、tf.Variable() 和 tf.get_variable()
(1)tf.Variable()会自动检测命名冲突并自行处理。
import tensorflow as tf
sess = tf.Session()
var1 = tf.Variable([1.2, 3.4], name = 'var')
var2 = tf.Variable([2.2, 5.5], name = 'var')
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var2.name, sess.run(var2))
### 运行结果:
var:0 [1.2 3.4]
var_1:0 [2.2 5.5] ## 变量名自动变为var_1,避免与var冲突
(2)tf.get_variable()有一个变量检测机制,会检测已经存在的变量是否设置为共享变量,如果已经存在该变量且没有被设置为共享变量,则TensorFlow运行到第二个变量时会报错。 设置为共享变量的值相等。
1、未设置为共享变量:
import tensorflow as tf
sess = tf.Session()
var1 = tf.get_variable(name = 'get_var', shape = [2,3])
var2 = tf.get_variable(name = 'get_var', shape = [2,3])
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var2.name, sess.run(var2))
## 运行结果:
ValueError: Variable get_var already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? Originally defined at:
File "<ipython-input-1-b4ded7fba4ad>", line 3, in <module>
2、设置为共享变量,值相等:
import tensorflow as tf
sess = tf.Session()
with tf.variable_scope('var_scope') as scope:
scope.reuse_variables() ## 变量共享机制,该段代码和在tf.variable_scope函数中加入reuse = True的作用相同。
var1 = tf.get_variable(name = 'var', shape = [2,1], dtype = tf.float32)
var2 = tf.get_variable(name = 'var')
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var2.name, sess.run(var2))
## var1和var2的变量名相同,值也相同。运行结果:
var_scope/var:0 [[ 0.2602787 ]
[-0.01280653]]
var_scope/var:0 [[ 0.2602787 ]
[-0.01280653]]
2、tf.name_scope()与tf.variable_scope()
(1) tf.name_scope()创建一个graph,作用相当于一个以name参数命名的文件夹,主要用于管理一个graph里的各种operation。每一个graph下面可以定义各种operation或者subgraph,实现一种层次化有条理的管理,避免各个op之间命名冲突。
(2)tf.variable_scope()一般与tf.name_scope()配合使用,用于管理一个graph中变量的名字,避免变量之间的命名冲突,tf.variable_scope()允许在一个variable_scope下面共享变量。variable_scope的reuse的默认值为False。见上面的例子。
(3) 通常情况下,tf.variable_scope和tf.name_scope配合,能画出非常漂亮的流程图,但是他们两个之间又有着细微的差别,那就是name_scope只能管住操作ops的名字,而管不住变量Variables的名字。