Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TensorFlow: varscope.reuse_variables()

How do I reuse variables in TensorFlow? I want to reuse the tf.contrib.layers.linear

with tf.variable_scope("root") as varscope:
    inputs_1 = tf.constant(0.5, shape=[2, 3, 4])
    inputs_2 = tf.constant(0.5, shape=[2, 3, 4])
    outputs_1 = tf.contrib.layers.linear(inputs_1, 5)
    varscope.reuse_variables()
    outputs_2 = tf.contrib.layers.linear(inputs_2, 5)

But it gives me the following result

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-51-a40b9ec68e25> in <module>()
      5     outputs_1 = tf.contrib.layers.linear(inputs_1, 5)
      6     varscope.reuse_variables()
----> 7     outputs_2 = tf.contrib.layers.linear(inputs_2, 5)
...
ValueError: Variable root/fully_connected_1/weights does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?
like image 245
Alexander R Johansen Avatar asked Nov 10 '16 20:11

Alexander R Johansen


People also ask

What does TF Variable_scope do?

Variable scope allows you to create new variables and to share already created ones while providing checks to not create or share by accident. For details, see the Variable Scope How To, here we present only a few basic examples. The Variable Scope works as expected when the Eager Execution is Disabled.

What is TF Get_variable?

The function tf. get_variable() returns the existing variable with the same name if it exists, and creates the variable with the specified shape and initializer if it does not exist.


1 Answers

The problem is tf.contrib.layers.linear automatically creates a new set of linear layers with its own scope. When calling scope.reuse() there's nothing to be reused because those are new variables.

Try to do something like this instead

def function():
  with tf.variable_scope("root") as varscope:
    inputs = tf.constant(0.5, shape=[2, 3, 4])
    outputs = tf.contrib.layers.linear(inputs, 5)
    return outputs

result_1 = function()
tf.get_variable_scope().reuse_variables()
result_2 = function()

sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
a = sess.run(result_1)
b = sess.run(result_2)
np.all(a == b) # ==> True
like image 100
Steven Avatar answered Oct 16 '22 18:10

Steven