FailedPreconditionError: Intentando usar uninitialized en Tensorflow

Estoy trabajando con el tutorial de TensorFlow , que utiliza un formato “extraño” para cargar los datos. Me gustaría usar el formato NumPy o pandas para los datos, de modo que pueda compararlo con los resultados de scikit-learn.

Obtengo los datos de reconocimiento de dígitos de Kaggle: https://www.kaggle.com/c/digit-recognizer/data .

Aquí el código del tutorial de TensorFlow (que funciona bien):

# Stuff from tensorflow tutorial import tensorflow as tf sess = tf.InteractiveSession() x = tf.placeholder("float", shape=[None, 784]) y_ = tf.placeholder("float", shape=[None, 10]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.nn.softmax(tf.matmul(x, W) + b) cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 

Aquí leo los datos, elimino las variables objective y divido los datos en pruebas y conjuntos de datos de entrenamiento (todo esto funciona bien):

 # Read dataframe from training data csvfile='train.csv' from pandas import DataFrame, read_csv df = read_csv(csvfile) # Strip off the target data and make it a separate dataframe. Target = df.label del df["label"] # Split data into training and testing sets msk = np.random.rand(len(df)) < 0.8 dfTest = df[~msk] TargetTest = Target[~msk] df = df[msk] Target = Target[msk] # One hot encode the target OHTarget=pd.get_dummies(Target) OHTargetTest=pd.get_dummies(TargetTest) 

Ahora, cuando bash ejecutar el paso de entrenamiento, obtengo un FailedPreconditionError :

 for i in range(100): batch = np.array(df[i*50:i*50+50].values) batch = np.multiply(batch, 1.0 / 255.0) Target_batch = np.array(OHTarget[i*50:i*50+50].values) Target_batch = np.multiply(Target_batch, 1.0 / 255.0) train_step.run(feed_dict={x: batch, y_: Target_batch}) 

Aquí está el error completo:

 --------------------------------------------------------------------------- FailedPreconditionError Traceback (most recent call last)  in () 4 Target_batch = np.array(OHTarget[i*50:i*50+50].values) 5 Target_batch = np.multiply(Target_batch, 1.0 / 255.0) ----> 6 train_step.run(feed_dict={x: batch, y_: Target_batch}) /Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.pyc in run(self, feed_dict, session) 1265 none, the default session will be used. 1266 """ -> 1267 _run_using_default_session(self, feed_dict, self.graph, session) 1268 1269 /Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.pyc in _run_using_default_session(operation, feed_dict, graph, session) 2761 "the operation's graph is different from the session's " 2762 "graph.") -> 2763 session.run(operation, feed_dict) 2764 2765 /Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict) 343 344 # Run request and get response. --> 345 results = self._do_run(target_list, unique_fetch_targets, feed_dict_string) 346 347 # User may have fetched the same tensor multiple times, but we /Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in _do_run(self, target_list, fetch_list, feed_dict) 417 # pylint: disable=protected-access 418 raise errors._make_specific_exception(node_def, op, e.error_message, --> 419 e.code) 420 # pylint: enable=protected-access 421 raise e_type, e_value, e_traceback FailedPreconditionError: Attempting to use uninitialized value Variable_1 [[Node: gradients/add_grad/Shape_1 = Shape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_1)]] Caused by op u'gradients/add_grad/Shape_1', defined at: File "/Users/user32/anaconda/lib/python2.7/runpy.py", line 162, in _run_module_as_main ........... ...which was originally created as op u'add', defined at: File "/Users/user32/anaconda/lib/python2.7/runpy.py", line 162, in _run_module_as_main "__main__", fname, loader, pkg_name) [elided 17 identical lines from previous traceback] File "/Users/user32/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 3066, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "", line 1, in  y = tf.nn.softmax(tf.matmul(x,W) + b) File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 403, in binary_op_wrapper return func(x, y, name=name) File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 44, in add return _op_def_lib.apply_op("Add", x=x, y=y, name=name) File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 633, in apply_op op_def=op_def) File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1710, in create_op original_op=self._default_original_op, op_def=op_def) File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 988, in __init__ self._traceback = _extract_stack() 

¿Alguna idea de cómo puedo solucionar esto?

El FailedPreconditionError surge porque el progtwig está intentando leer una variable (llamada "Variable_1" ) antes de que se haya inicializado. En TensorFlow, todas las variables deben inicializarse explícitamente, ejecutando sus operaciones de “inicializador”. Para su comodidad, puede ejecutar todos los inicializadores de variables en la sesión actual ejecutando la siguiente instrucción antes de su ciclo de entrenamiento:

 tf.initialize_all_variables().run() 

Tenga en cuenta que esta respuesta asume que, como en la pregunta, está utilizando tf.InteractiveSession , que le permite ejecutar operaciones sin especificar una sesión. Para usos no interactivos, es más común usar tf.Session e inicializarse de la siguiente manera:

 init_op = tf.initialize_all_variables() sess = tf.Session() sess.run(init_op) 

tf.initialize_all_variables() está en desuso. En su lugar, inicialice las variables tensorflow con:

 tf.global_variables_initializer() 

Un ejemplo de uso común es:

 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) 

De la documentación oficial, FailedPreconditionError

Esta excepción generalmente se produce cuando se ejecuta una operación que lee una variable tf.Variable antes de que se haya inicializado.

En su caso, el error incluso explica qué variable no se inicializó: Attempting to use uninitialized value Variable_1 . Uno de los tutoriales de TF explica mucho sobre las variables, su creación / inicialización / guardar / cargar

Básicamente para inicializar la variable tienes 3 opciones:

  • inicialice todas las variables globales con tf.global_variables_initializer()
  • inicialice las variables que le interesan con tf.variables_initializer(list_of_vars) . Tenga en cuenta que puede usar esta función para imitar global_variable_initializer: tf.variable_initializers(tf.global_variables())
  • inicialice solo una variable con var_name.initializer

Casi siempre uso el primer enfoque. Recuerda que debes ponerlo dentro de una sesión ejecutada. Así obtendrás algo como esto:

 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) 

Si tiene curiosidad por obtener más información acerca de las variables, lea esta documentación para saber cómo informar de las report_uninitialized_variables de report_uninitialized_variables y de la report_uninitialized_variables y verifique que se haya is_variable_initialized .

Caso de uso diferente, pero establecer su sesión como la sesión predeterminada hizo el truco para mí:

 with sess.as_default(): result = compute_fn([seed_input,1]) 

Este es uno de estos errores que es tan obvio, una vez que lo haya resuelto.

Mi caso de uso es el siguiente:
1) almacenar keras VGG16 como gráfico de tensorflow
2) cargar kers VGG16 como un gráfico
3) ejecuta la función tf en el gráfico y obtén:

 FailedPreconditionError: Attempting to use uninitialized value block1_conv2/bias [[Node: block1_conv2/bias/read = Identity[T=DT_FLOAT, _class=["loc:@block1_conv2/bias"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](block1_conv2/bias)]] [[Node: predictions/Softmax/_7 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_168_predictions/Softmax", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]] 

Recibí este mensaje de error de un caso completamente diferente. Parecía que el manejador de excepciones en tensorflow lo planteaba. Puedes revisar cada fila en el Traceback. En mi caso, sucedió en tensorflow/python/lib/io/file_io.py , porque este archivo contenía un error diferente, donde self.__mode self.__name y self.__name no estaban inicializados, y debía llamarse self._FileIO__mode , y self_FileIO__name en self_FileIO__name lugar.

Cuando tuve este problema con tf.train.string_input_producer() y tf.train.batch() inicializando las variables locales antes de comenzar, el Coordinador resolvió el problema. Había estado recibiendo el error cuando inicialicé las variables locales después de iniciar el Coordinador.

FailedPreconditionError se produce porque la sesión está intentando leer una variable que no se ha inicializado.

A partir de la versión 1.11.0 de Tensorflow, debe tomar esto:

 init_op = tf.global_variables_initializer() sess = tf.Session() sess.run(init_op) 

Tienes que inicializar las variables antes de usarlas.

Si intenta evaluar las variables antes de inicializarlas, se encontrará con: FailedPreconditionError: Attempting to use uninitialized value tensor.

La forma más fácil es inicializar todas las variables a la vez usando: tf.global_variables_initializer()

 init = tf.global_variables_initializer() with tf.Session() as sess: tf.run(init) 

Utiliza tf.run(init) para ejecutar el inicializador, sin obtener ningún valor.

Para inicializar solo un subconjunto de variables, usa tf.variables_initializer() listando las variables:

 var_ab = tf.variables_initializer([a, b], name="a_and_b") with tf.Session() as sess: tf.run(var_ab) 

También puede inicializar cada variable por separado usando tf.Variable.initializer

 # create variable W as 784 x 10 tensor, filled with zeros W = tf.Variable(tf.zeros([784,10])) with tf.Session() as sess: tf.run(W.initializer) 

Es posible que algo haya cambiado en las comstackciones recientes de TensorFlow, porque para mí, correr

 sess = tf.Session() sess.run(tf.local_variables_initializer()) 

Antes de ajustar cualquier modelo parece hacer el truco. La mayoría de los ejemplos y comentarios más antiguos parecen sugerir tf.global_variables_initializer() .