问题来源:
例如卷积神经网络,循环神经网络有大量的变量需要共享,而且在同一地方初始化所有变量,因此就产生共享变量和变量作用域机制的概念。
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

这篇博客详细介绍了TensorFlow中的变量作用域机制和共享变量的实现,通过`tf.variable_scope()`和`tf.get_variable()`函数进行阐述。内容包括变量作用域的创建、变量全称的构成、初始化器的继承以及变量的重用规则。此外,还提到了变量创建的其他函数,如`tf.Variable()`和命名空间的创建函数。
最低0.47元/天 解锁文章
1044

被折叠的 条评论
为什么被折叠?



