2016-03-15 1 views
23

Я пытаюсь реализовать многомерную линейную регрессию в Python с использованием TensorFlow, но столкнулся с некоторыми проблемами логики и реализации. Мой код выдает следующее сообщение об ошибке:TensorFlow: «Попытка использовать неинициализированное значение» в переменной инициализации

Attempting to use uninitialized value Variable 
Caused by op u'Variable/read' 

В идеале weights выход должен быть [2, 3]

def hypothesis_function(input_2d_matrix_trainingexamples, 
         output_matrix_of_trainingexamples, 
         initial_parameters_of_hypothesis_function, 
         learning_rate, num_steps): 
    # calculate num attributes and num examples 
    number_of_attributes = len(input_2d_matrix_trainingexamples[0]) 
    number_of_trainingexamples = len(input_2d_matrix_trainingexamples) 

    #Graph inputs 
    x = [] 
    for i in range(0, number_of_attributes, 1): 
     x.append(tf.placeholder("float")) 
    y_input = tf.placeholder("float") 

    # Create Model and Set Model weights 
    parameters = [] 
    for i in range(0, number_of_attributes, 1): 
     parameters.append(
      tf.Variable(initial_parameters_of_hypothesis_function[i])) 

    #Contruct linear model 
    y = tf.Variable(parameters[0], "float") 
    for i in range(1, number_of_attributes, 1): 
     y = tf.add(y, tf.multiply(x[i], parameters[i])) 

    # Minimize the mean squared errors 
    loss = tf.reduce_mean(tf.square(y - y_input)) 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
    train = optimizer.minimize(loss) 

    #Initialize the variables 
    init = tf.initialize_all_variables() 

    # launch the graph 
    session = tf.Session() 
    session.run(init) 
    for step in range(1, num_steps + 1, 1): 
     for i in range(0, number_of_trainingexamples, 1): 
      feed = {} 
      for j in range(0, number_of_attributes, 1): 
       array = [input_2d_matrix_trainingexamples[i][j]] 
       feed[j] = array 
      array1 = [output_matrix_of_trainingexamples[i]] 
      feed[number_of_attributes] = array1 
      session.run(train, feed_dict=feed) 

    for i in range(0, number_of_attributes - 1, 1): 
     print (session.run(parameters[i])) 

array = [[0.0, 1.0, 2.0], [0.0, 2.0, 3.0], [0.0, 4.0, 5.0]] 
hypothesis_function(array, [8.0, 13.0, 23.0], [1.0, 1.0, 1.0], 0.01, 200) 
+0

Какую линию вы получите исключение на? –

+0

@ Daniel Slater в строке: - parameters.append (tf.Variable (initial_parameters_of_hypothesis_function [i])) –

+3

OK, является initial_parameters_of_hypothesis_function массивом tf.variable? Если это ваша проблема. –

ответ

9

Это не 100% ясно из примера кода, но если список initial_parameters_of_hypothesis_function список tf.Variable объектов, то строка session.run(init) потерпит неудачу, потому что TensorFlow пока не достаточно умен, чтобы выяснить зависимости при инициализации переменных. Чтобы обойти эту проблему, необходимо изменить цикл, который создает parameters использовать initial_parameters_of_hypothesis_function[i].initialized_value(), который добавляет необходимую зависимость:

parameters = [] 
for i in range(0, number_of_attributes, 1): 
    parameters.append(tf.Variable(
     initial_parameters_of_hypothesis_function[i].initialized_value())) 
+0

Это сработало, но теперь оно дает ошибку: - TypeError: не может интерпретировать ключ feed_dict как тензор: невозможно преобразовать int в тензор. в строке сеанса.run (train, feed_dict = feed) –

+1

Сообщение об ошибке сообщает вам, что не так: ключи словаря «feed» должны быть «тензорными» объектами (как правило, тензорами tf.placeholder() », а не' int'. Вероятно, вы захотите заменить 'feed [j] = array' на' feed [x [j]] = array'. – mrry

+0

Я понятия не имею, как реализовать стохастический градиентный спуск в тензорном потоке, не могли бы вы предложить? –

25

Выполнить это:

init = tf.global_variables_initializer() 
sess.run(init) 

Или (в зависимости от версии TF, что вам есть):

init = tf.initialize_all_variables() 
sess.run(init) 
+1

init = tf.global_variables_initializer() –

+0

Да, спасибо. TF обновил свои спецификации. –

+0

теперь это tf. initialize_all_variables() –

2

Я хочу дать свое разрешение, она работает, когда я заменить строку [session = tf.Session()] с [sess = tf.InteractiveSession()]. Надеюсь, это будет полезно для других.

+0

Спасибо, это действительно помогло мне во время работы в Jupyter Notebook. Можете объяснить, почему это работает? – shubhamsingh

3

Существует другая ошибка, связанная с порядком при вызове инициализации глобальных переменных. У меня был образец кода имеет аналогичную ошибку FailedPreconditionError (см выше TRACEBACK): Попытка использовать неинициализированный значение W

def linear(X, n_input, n_output, activation = None): 
    W = tf.Variable(tf.random_normal([n_input, n_output], stddev=0.1), name='W') 
    b = tf.Variable(tf.constant(0, dtype=tf.float32, shape=[n_output]), name='b') 
    if activation != None: 
     h = tf.nn.tanh(tf.add(tf.matmul(X, W),b), name='h') 
    else: 
     h = tf.add(tf.matmul(X, W),b, name='h') 
    return h 

from tensorflow.python.framework import ops 
ops.reset_default_graph() 
g = tf.get_default_graph() 
print([op.name for op in g.get_operations()]) 
with tf.Session() as sess: 
    # RUN INIT 
    sess.run(tf.global_variables_initializer()) 
    # But W hasn't in the graph yet so not know to initialize 
    # EVAL then error 
    print(linear(np.array([[1.0,2.0,3.0]]).astype(np.float32), 3, 3).eval()) 

Вы должны изменить к следующему

from tensorflow.python.framework import ops 
ops.reset_default_graph() 
g = tf.get_default_graph() 
print([op.name for op in g.get_operations()]) 
with tf.Session() as 
    # NOT RUNNING BUT ASSIGN 
    l = linear(np.array([[1.0,2.0,3.0]]).astype(np.float32), 3, 3) 
    # RUN INIT 
    sess.run(tf.global_variables_initializer()) 
    print([op.name for op in g.get_operations()]) 
    # ONLY EVAL AFTER INIT 
    print(l.eval(session=sess)) 
+0

Заказ имел значение - спасибо! – ltt

0

Обычно есть два способы инициализации переменных, 1) с использованием sess.run(tf.global_variables_initializer()), как отмечалось в предыдущих ответах; 2) загрузить график из контрольной точки.

Вы можете сделать так:

sess = tf.Session(config=config) 
saver = tf.train.Saver(max_to_keep=3) 
try: 
    saver.restore(sess, tf.train.latest_checkpoint(FLAGS.model_dir)) 
    # start from the latest checkpoint, the sess will be initialized 
    # by the variables in the latest checkpoint 
except ValueError: 
    # train from scratch 
    init = tf.global_variables_initializer() 
    sess.run(init) 

И третий способ заключается в использовании tf.train.Supervisor. Сессия будет

Create a session on 'master', recovering or initializing the model as needed, or wait for a session to be ready.

sv = tf.train.Supervisor([parameters]) 
sess = sv.prepare_or_wait_for_session() 
Смежные вопросы