问题来源:
例如卷积神经网络,循环神经网络有大量的变量需要共享,而且在同一地方初始化所有变量,因此就产生共享变量和变量作用域机制的概念。
1. tf.variable_scope()的理解 & 变量作用域机制
1.1. tf.variable_scope()
tf.variable_scope(name, initializer, reuse)
name:变量作用域的名称
initializer:可选,在该变量作用域内默认的初始化器
reuse:布尔值,默认为False,是否可重用变量
或者使用object.reuse_variable()
来共享变量。object对象为变量作用域。
1.2. 变量作用域机制
- 使用
with tf.variable_scope()...:
来创建一个变量作用域。 - 在变量作用域内,创建的变量的名称的前缀是变量作用域的名称。即变量作用域内的变量的全称:变量作用域名称+’/’+变量的名称。例如,变量作用域的名称为foo, 变量的名称为v,则该变量的全称为:foo/v:0。
# 创建变量作用域,其名称为foo
with tf.variable_scope("foo"):
# 在该变量作用域内创建变量v,名称为v
v = tf.get_variable("v", [1], dtype="float")
print(v.name)
输出结果:
- 在变量作用域内,若变量作用域定义了一个初始化器,则在作用域内创建的变量的初始化器若无指定,则默认为变量作用域定义的初始化器。
# 创建变量作用域,域名为foo_1, 初始化器为常数初始化器
with tf.variable_scope("foo_1",initializer=tf.constant_initializer(0.5)):
# 创建变量v1,无指定初始化器,则该变量使用默认的初始化器,初始化结果为0.5
v1 = tf.get_variable("v1", [1], dtype="float")
# 创建变量w1,指定了初始化器,则该变量初始化结果为0.4
w1 = tf.get_variable("w1", [1], dtype="float", initializer=tf.constant_initializer(0.4))
- 变量作用域下ops的全称:变量作用域的名称+’/’+op的名称。若有名称作用域添加到变量作用域中,则只会影响ops的全称,不会影响变量的全称。
# 创建变量作用域,域名为foo_2
with tf.variable_scope("foo_2"):
# 创建变量v2