python - retraining - tensorflow image classification training
FailedPreconditionError: intento de uso sin inicializar en Tensorflow (9)
Caso de uso diferente, pero configurar 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 ha 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) ejecute la función tf en el gráfico y obtenga:
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"]()]]
Estoy trabajando a través del tutorial TensorFlow , que utiliza un formato "extraño" para cargar los datos. Me gustaría usar el formato NumPy o pandas para los datos, para poder compararlo con los resultados de scikit-learn.
Recibo los datos de reconocimiento de dígitos de Kaggle: https://www.kaggle.com/c/digit-recognizer/data .
Aquí el código del tutorial 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 objetivo y divido los datos en conjuntos de datos de prueba y 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 trato de 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)
<ipython-input-82-967faab7d494> in <module>()
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 "<ipython-input-45-59183d86e462>", line 1, in <module>
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?
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.
Recibí el error cuando inicialicé las variables locales después de iniciar el Coordinador.
De la documentación oficial, FailedPreconditionError
Esta excepción se genera más comúnmente cuando se ejecuta una operación que lee un 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
creation/initialization/saving/loading
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. Recuerde que debe ponerlo dentro de una sesión ejecutada. Entonces 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 sobre las variables, lea
esta documentación
para saber cómo
report_uninitialized_variables
y marque
is_variable_initialized
.
Debe 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:
sess.run(init)
Utiliza
sess.run(init)
para ejecutar el inicializador, sin obtener ningún valor.
Para inicializar solo un subconjunto de variables, use
tf.variables_initializer()
enumera las variables:
var_ab = tf.variables_initializer([a, b], name="a_and_b")
with tf.Session() as sess:
sess.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:
sess.run(W.initializer)
El
FailedPreconditionError
surge porque el programa está intentando leer una variable (denominada
"Variable_1"
) antes de que se haya inicializado.
En TensorFlow, todas las variables deben inicializarse explícitamente, ejecutando sus operaciones "inicializadoras".
Para mayor comodidad, puede ejecutar todos los inicializadores 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 supone 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 inicializar de la siguiente manera:
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
Posiblemente algo ha cambiado en las compilaciones recientes de TensorFlow, porque para mí, ejecutar
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()
.
Recibí este mensaje de error de un caso completamente diferente.
Parecía que el controlador de excepciones en tensorflow lo levantó.
Puede verificar cada fila en el rastreo.
En mi caso, sucedió en
tensorflow/python/lib/io/file_io.py
, porque este archivo contenía un error diferente, donde
self.__mode
y
self.__name
no se inicializaron, y necesitaba llamar
self._FileIO__mode
, y
self_FileIO__name
en
self_FileIO__name
lugar.
tf.initialize_all_variables()
está en desuso.
En su lugar, inicialice las variables de tensorflow con:
tf.global_variables_initializer()
Un ejemplo de uso común es:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
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)