TensorFlow共享变量
TensorFlow提供了几个类和操作,您可以使用它们根据特定条件创建变量:
- tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None, trainable=True, collections=None)
获取具有这些参数的现有变量或创建一个新变量。获取具有这些参数的现有变量或创建一个新变量。
一个例子:
with tf.variable_scope("foo"):
v = get_variable("v", [1]) # v.name == "foo/v:0"
w = get_variable("w", [1]) # w.name == "foo/w:0"
with tf.variable_scope("foo", reuse=True)
v1 = get_variable("v") # The same as v above.
- tf.get_variable_scope()
返回当前变量范围。 - tf.variable_scope(name_or_scope, reuse=None, initializer=None)
变量范围允许创建新变量并共享已创建的变量。
创建新变量:
with tf.variable_scope("foo"):
with tf.variable_scope("bar"):
v = tf.get_variable("v", [1])
assert v.name == "foo/bar/v:0"
共享变量的基本示例:
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True): #reuse=Ture才能共享
v1 = tf.get_variable("v", [1])
assert v1 == v
通过捕获范围和设置重用来共享变量:
with tf.variable_scope("foo") as scope:
v = get_variable("v", [1])
scope.reuse_variables()
v1 = tf.get_variable("v", [1])
assert v1 == v
为了防止意外共享变量,我们在非重用范围内获取现有变量时引发异常:
with tf.variable_scope("foo") as scope:
v = get_variable("v", [1])
v1 = tf.get_variable("v", [1])
# Raises ValueError("... v already exists ...").
类似地,我们在尝试获取在重用模式下不存在的变量时引发异常:
with tf.variable_scope("foo", reuse=True):
v = get_variable("v", [1])
# Raises ValueError("... v does not exists ...").
- tf.constant_initializer(value=0.0)
返回使用单个值生成Tensors的初始值设定项。 - tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None)]
返回生成具有正态分布的张量的初始值设定项。 - tf.truncated_normal_initializer(mean=0.0, stddev=1.0, seed=None)
返回生成截断的正态分布的初始值设定项。这些值类似于来自random_normal_initializer()的值,除了丢弃并重新绘制超过平均值两个标准偏差的值。 - tf.random_uniform_initializer(minval=0.0, maxval=1.0, seed=None)
返回生成具有均匀分布的张量的初始值设定项。 - tf.uniform_unit_scaling_initializer(factor=1.0, seed=None)
返回生成张量而不缩放方差的初始值设定项。 - tf.zeros_initializer(shape, dtype=tf.float32)
返回初始值为0设定项。
更详细请看原文链接: [http://www.tensorfly.cn/tfdoc/api_docs/python/state_ops.html#random_uniform_initializer]