Charlie Parker
Charlie Parker

Reputation: 5201

Why can't I access the variable I create using the variable name plus scope path in TensorFlow?

I was trying to get a variable I created in a simple function but I keep getting errors. I am doing:

x = tf.get_variable('quadratic/x')

but the python complains as follow:

python qm_tb_scopes.py
quadratic/x:0
Traceback (most recent call last):
  File "qm_tb_scopes.py", line 24, in <module>
    x = tf.get_variable('quadratic/x')
  File "/Users/my_username/path/tensor_flow_experiments/venv/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 732, in get_variable
    partitioner=partitioner, validate_shape=validate_shape)
  File "/Users/my_username/path/tensor_flow_experiments/venv/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 596, in get_variable
    partitioner=partitioner, validate_shape=validate_shape)
  File "/Users/my_username/path/tensor_flow_experiments/venv/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 161, in get_variable
    caching_device=caching_device, validate_shape=validate_shape)
  File "/Users/my_username/path/tensor_flow_experiments/venv/lib/python2.7/site-packages/tensorflow/python/ops/variable_scope.py", line 457, in _get_single_variable
    "but instead was %s." % (name, shape))
ValueError: Shape of a new variable (quadratic/x) must be fully defined, but instead was <unknown>.

it seems its trying to create a new variable, but I am simply trying to get a defined one. Why is it doing this?

The whole code is:

import tensorflow as tf

def get_quaratic():
    # x variable
    with tf.variable_scope('quadratic'):
        x = tf.Variable(10.0,name='x')
        # b placeholder (simualtes the "data" part of the training)
        b = tf.placeholder(tf.float32,name='b')
        # make model (1/2)(x-b)^2
        xx_b = 0.5*tf.pow(x-b,2)
        y=xx_b
        return y,x

y,x = get_quaratic()
learning_rate = 1.0
# get optimizer
opt = tf.train.GradientDescentOptimizer(learning_rate)
# gradient variable list = [ (gradient,variable) ]
print x.name
x = tf.get_variable('quadratic/x')
x = tf.get_variable(x.name)

Upvotes: 0

Views: 2836

Answers (2)

Gautam Salhotra
Gautam Salhotra

Reputation: 1

This is not the best solution, but try creating the variable through tf.get_variable() with reuse=False to ensure a new variable is created. Then, when obtaining the variable, use tf.get_variable() with reuse=True to get the current variable. Setting reuse to tf.AUTO_REUSE risks the creation of a new variable if the exact var is not present. Also make sure to specify the shape of the variable in tf.get_variable().

import tensorflow as tf

def get_quaratic():
    # x variable
    with tf.variable_scope('quadratic', reuse=False):
        x = tf.get_variable('x', ())
        tf.assign(x, 10)
        # b placeholder (simualtes the "data" part of the training)
        b = tf.placeholder(tf.float32,name='b')
        # make model (1/2)(x-b)^2
        xx_b = 0.5*tf.pow(x-b,2)
        y=xx_b
        return y,x
y,x = get_quaratic()
learning_rate = 1.0
# get optimizer
opt = tf.train.GradientDescentOptimizer(learning_rate)
# gradient variable list = [ (gradient,variable) ]
print (x.name)

with tf.variable_scope('', reuse=True):
    x = tf.get_variable('quadratic/x', shape=())
print(tf.global_variables())  # there is only 1 variable

Upvotes: 0

Peter Hawkins
Peter Hawkins

Reputation: 3211

You need to pass the option reuse=True to tf.variable_scope() if you want to get the same variable twice.

See the documentation (https://www.tensorflow.org/versions/r0.9/how_tos/variable_scope/index.html) for more details.

Alternatively, you could get the variable once, outside your Python function, and pass it in as a argument in Python. I find that a bit cleaner since it makes it explicit what variables the code uses.

I hope that helps!

Upvotes: 4

Related Questions