即使变量范围没有提到reuse = True,也会重用变量

时间:2017-05-22 06:10:36

标签: python tensorflow

Sharing Variable教程中,它说明了如何使用函数get_variable()重用以前创建的变量。

with tf.variable_scope("foo"):      # Creation
    v = tf.get_variable("v", [1])

with tf.variable_scope("foo", reuse=True):    # Re-using
    v1 = tf.get_variable("v", [1])

但在here_linear()函数的实现中,get_variable()函数的用法如下。

with vs.variable_scope(scope) as outer_scope:
    weights = vs.get_variable(
        _WEIGHTS_VARIABLE_NAME, [total_arg_size, output_size],
        dtype=dtype,
        initializer=kernel_initializer)

据我所知,_linear()函数用于执行操作args * W + bias。这里权重(W)必须是可重复使用的 但是在他们在get_variable()函数中使用_linear()函数的方式中,我认为每次都会创建一个新变量。但是W必须可以重复使用神经网络。

我想了解这里发生的事情。

1 个答案:

答案 0 :(得分:0)

他们使用以下事实记录here

  

请注意,重用标志是继承的:如果我们打开一个重用范围,那么它的所有子范围也会重用。

因此,如果您的作用域嵌入到相应地设置重用标记的父作用域中,那么您将全部设置。例如:

import tensorflow as tf

def get_v():
  with tf.variable_scope("foo"):
      v = tf.get_variable("v", shape=(), initializer=tf.random_normal_initializer())
  return v

with tf.variable_scope("bar"):
  v = get_v()
with tf.variable_scope("bar", reuse=True):
  v1 = get_v()

sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(v)
sess.run(v1) # returns the same value

在本例中,父范围由父类tf.python.layers.Layer创建。