首先 import tensorflow as tf ,以下省略该句
with tf.name_scope('foo'):
initializer = tf.constant_initializer(1)
var1 = tf.get_variable('var1', shape=[1], dtype=tf.float32, initializer=initializer)
var2 = tf.Variable(2, dtype=tf.float32, name='var2')
var21 = tf.Variable(2.1, dtype=tf.float32, name='var21')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var2.name, sess.run(var2))
print(var21.name, sess.run(var21))
输出:
var1:0 [ 1.]
foo/var2:0 2.0
foo/var21:0 2.1
with tf.variable_scope('foo'):
initializer = tf.constant_initializer(1)
var1 = tf.get_variable('var1', shape=[1], dtype=tf.float32, initializer=initializer)
var2 = tf.Variable(2, dtype=tf.float32, name='var2')
var21 = tf.Variable(2.1, dtype=tf.float32, name='var21')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var2.name, sess.run(var2))
print(var21.name, sess.run(var21))
输出:
foo/var1:0 [ 1.]
foo/var2:0 2.0
foo/var21:0 2.1
可以看出tf.variabel_scope和tf.name_scope的区别
1)如果在 tf.name_scope() 环境下分别使用 tf.get_variable() 和 tf.Variable(),两者的主要区别在于
- tf.get_variable() 创建的变量名不受 name_scope 的影响;
- tf.get_variable() 创建的变量,name 属性值不可以相同;tf.Variable() 创建变量时,name 属性值允许重复(底层实现时,会自动引入别名机制)
2)如果在 tf.name_scope() 环境下分别使用 tf.get_variable() 和 tf.Variable(),变量名称上没有区别。
tf.name_scope() | tf.variable_scope() | |
---|---|---|
tf.get_variable() | var | foo/var |
tf.Varible() | foo/var | foo/var |
tf.get_variable 和tf.Variable不同的一点是,前者拥有一个变量检查机制,会检测已经存在的变量是否设置为共享变量,如果已经存在的变量没有设置为共享变量(reuse=False),TensorFlow 运行到第二个拥有相同名字的变量的时候,就会报错。
通常情况下,tf.variable_scope 和 tf.name_scope 配合,能画出非常漂亮的流程图,但是他们两个之间又有着细微的差别,那就是当使用tf.get_variable时,name_scope 只能管住操作 Ops 的名字,而管不住变量 Variables 的名字。
with tf.variable_scope("foo"):
with tf.name_scope("bar"):
v = tf.get_variable("v", [1])
x = 1.0 + v
print(v.name)
print(x.op.name)
assert v.name == "foo/v:0"
assert x.op.name == "foo/bar/add"
输出:
foo/v:0
foo/bar/add
tf.variable_scope和tf.name_scope的用法区别
tf.variable_scope可以让变量有相同的命名,包括tf.get_variable得到的变量,还有tf.Variable的变量。
tf.name_scope可以让变量有相同的命名,只是限于tf.Variable的变量。
with tf.variable_scope('variable_scope'):
a1 = tf.get_variable(name='a1', shape=[1], initializer=tf.constant_initializer(1))
a2 = tf.Variable(tf.constant(1, dtype=tf.float32), name='a2')
a = tf.add(a1, a2)
with tf.name_scope('name_scope'):
b1 = tf.get_variable(name='b1', shape=[1], initializer=tf.constant_initializer(1))
b2 = tf.Variable(tf.constant(1, tf.float32), name='b2')
b = tf.add(b1, b2)
print(a1.name)
print(a2.name)
print(a.name)
print(b1.name)
print(b2.name)
print(b.name)
输出:
variable_scope/a1:0
variable_scope/a2:0
variable_scope/Add:0
b1:0
name_scope/b2:0
name_scope/Add:0