TensorFlow: “Intentando usar un valor no inicializado” en la inicialización de variables

Estoy intentando implementar una regresión lineal multivariable en Python utilizando TensorFlow, pero me he topado con algunos problemas lógicos y de implementación. Mi código arroja el siguiente error:

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

Idealmente, la salida de weights debería ser [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) 

No está claro al 100% en el ejemplo del código, pero si la lista initial_parameters_of_hypothesis_function es una lista de tf.Variable objetos, entonces la línea session.run(init) fallará porque TensorFlow no es (todavía) lo suficientemente inteligente como para averiguar las dependencias En inicialización variable. Para evitar esto, debe cambiar el bucle que crea parameters para usar initial_parameters_of_hypothesis_function[i].initialized_value() , que agrega la dependencia necesaria:

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

Ejecuta esto:

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

O (dependiendo de la versión de TF que tengas):

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

Existe otro error que está relacionado con el pedido al llamar a las variables globales de inicialización. He tenido la muestra de código que tiene un error similar FailedPreconditionError (ver más arriba para el rastreo): Intento de usar un valor no inicializado 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()) 

Debes cambiar a seguir

 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)) 

Quiero dar mi resolución, funciona cuando reemplazo la línea [session = tf.Session()] con [sess = tf.InteractiveSession()] . Espero que esto sea de utilidad para otros.

Normalmente hay dos formas de inicializar variables, 1) usando sess.run(tf.global_variables_initializer()) como se indicó en las respuestas anteriores; 2) La carga del gráfico desde el punto de control.

Puedes hacer así:

 sess = tf.Session(config=config) saver = tf.train.Saver(max_to_keep=3) try: saver.restre(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) 

Y el tercer método es usar el tf.train.Supervisor . La sesion sera

Cree una sesión en ‘master’, recuperando o inicializando el modelo según sea necesario, o espere a que la sesión esté lista.

 sv = tf.train.Supervisor([parameters]) sess = sv.prepare_or_wait_for_session()