2016-06-06 2 views
0

Я пытался понять, как инициализируются переменные в Tensorflow. Ниже я создал простой пример, который определяет переменную в некотором variable_scope, и процесс завернут в подфункцию.Переменная инициализация в переменной_scope в Tensorflow

В моем понимании, этот код создает переменную 'x' внутри 'test_scope' на tf.initialize_all_variables() стадии, и всегда можно получить после этого с помощью tf.get_variable(). Но этот код закончил с ошибкой Attempting to use uninitialized value на линии print(x.eval()).

Я не имею ни малейшего представления о том, как Tensorflow инициализирует переменные. Могу ли я получить помощь? Спасибо.

import tensorflow as tf 

def create_var_and_prod_with(y): 
    with tf.variable_scope('test_scope'): 
     x = tf.Variable(0.0, name='x', trainable=False) 
    return x * y 

s = tf.InteractiveSession() 
y = tf.Variable(1.0, name='x', trainable=False) 
create_var_and_prod_with(y) 

s.run(tf.initialize_all_variables()) 

with tf.variable_scope('test_scope'): 
    x = tf.get_variable('x', [1], initializer=tf.constant_initializer(0.0), trainable=False) 
    print(x.eval()) 
    print(y.eval()) 

ответ

0

Если вы хотите использовать переменную, вы должны объявить его с помощью get_variables и чем явно просят рамки, чтобы переменные повторно.

Если вы измените строку

x = tf.Variable(0.0, name='x', trainable=False) 

с:

x = tf.get_variable('x', [1], trainable=False) 

И вы просите за рамки, чтобы сделать уже определена переменная доступна:

with tf.variable_scope('test_scope') as scope: 
    scope.reuse_variables() 
     x = tf.get_variable('x', [1], initializer=tf.constant_initializer(0.0), trainable=False) 

Затем вы можете запустить print(x.eval(), y.eval()) без проблем.

+0

Благодарим за помощь! Я сделал это вместе с вашим предложением, и это сработало! – kohta

+0

Добро пожаловать. Если мой ответ решит вашу проблему, не забудьте отметить его как принятый. – nessuno

0

Если вы хотите повторно использовать переменную с tf.get_variable('x'), переменная должна быть создана в первую очередь с помощью tf.get_variable('x').
Moreover, when you want to retrieve a created variable, you need to be in a scope with
reuse = True`.


Вот что ваш код должен выглядеть следующим образом:

import tensorflow as tf 

def create_var_and_prod_with(y): 
    with tf.variable_scope('test_scope'): 
     x = tf.get_variable('x', [1], initializer=tf.constant_initializer(0.0), trainable=False) 
    return x * y 

y = tf.Variable(1.0, name='x', trainable=False) 
create_var_and_prod_with(y) 

with tf.variable_scope('test_scope', reuse=True): 
    x = tf.get_variable('x') # you only need the name to retrieve x 

# Try to put the session only at the end when it is needed 
with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    print(x.eval()) 
    print(y.eval()) 

Вы можете прочитать об этом в this tutorial.

+0

Спасибо большое! Как вы сказали, аргументы get_variable() были избыточными на этапе поиска. reuse = True вариант кажется эквивалентным вызову функции scope.reuse_variables(). Он также работал. Благодарю. – kohta

Смежные вопросы