FailedPreconditionError: tenter d'utiliser uninitialized in Tensorflow
je travaille à travers le tutoriel TensorFlow , qui utilise un format" bizarre " pour télécharger les données. Je voudrais utiliser le format NumPy ou pandas pour les données, afin de pouvoir les comparer avec les résultats de scikit-learn.
je reçois les données de reconnaissance numérique de Kaggle: https://www.kaggle.com/c/digit-recognizer/data .
voici le code du tutoriel TensorFlow (qui fonctionne 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)
ici, je lis les données, je supprime les variables cibles et je divise les données en ensembles de données d'essai et de formation (tout cela fonctionne 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)
Maintenant, quand j'essaye d'exécuter l'étape de formation, je reçois 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})
Voici l'erreur complète:
---------------------------------------------------------------------------
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()
une idée de comment je peux réparer ça?
6 réponses
le FailedPreconditionError
se produit parce que le programme tente de lire une variable (appelée "Variable_1"
) avant qu'elle ait été initialisée. Dans TensorFlow, toutes les variables doivent être initialisées explicitement, en exécutant leurs opérations de "initialisation". Pour plus de commodité, vous pouvez exécuter tous les initialisateurs de variables dans la session courante en exécutant la déclaration suivante avant votre boucle d'entraînement:
tf.initialize_all_variables().run()
Notez que cette réponse suppose que, comme dans la question, vous utilisez tf.InteractiveSession
, qui vous permet d'exécuter des opérations sans spécifier de session. Pour les utilisations non interactives , il est plus courant d'utiliser tf.Session
, et d'initialiser comme suit:
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
tf.initialize_all_variables()
est déprécié. À la place, initialisez les variables de tensorflow avec:
tf.global_variables_initializer()
un exemple d'usage courant est:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
à Partir de la documentation officielle, FailedPreconditionError
cette exception est le plus souvent soulevée lors de l'exécution d'une opération qui ça lit un tf.Variable avant qu'elle ait été initialisée.
dans votre cas, l'erreur explique même quelle variable n'a pas été initialisée: Attempting to use uninitialized value Variable_1
. Un des tutoriels de TF explique beaucoup de choses sur les variables, leur création/initialisation/sauvegarde/chargement
fondamentalement pour initialiser la variable vous avez 3 options:
- initialiser toutes les variables globales avec
tf.global_variables_initializer()
- initialiser des variables que vous vous souciez avec
tf.variables_initializer(list_of_vars)
. Notez que vous pouvez utiliser cette fonction pour imiter global_variable_initializer:tf.variable_initializers(tf.global_variables())
- initialiser une seule variable avec
var_name.initializer
j'utilise presque toujours la première approche. Rappelez-vous que vous devriez le mettre dans une session de course. Vous obtiendrez donc quelque chose comme ceci:
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
si vous êtes curieux de plus amples informations sur les variables, lisez cette documentation pour savoir comment report_uninitialized_variables
et cochez is_variable_initialized
.
cas D'utilisation différent, mais définir votre session comme la session par défaut a fait le tour pour moi:
with sess.as_default():
result = compute_fn([seed_input,1])
C'est une de ces erreurs qui est si évidente, une fois que vous l'avez résolu.
mon étui est le suivant:
1) stocker le kéras VGG16 comme TensorFlow graph
2) Charger kers VGG16 comme un graphe
3) lancer la fonction tf sur le graphe et obtenir:
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"]()]]
j'ai reçu ce message d'erreur d'un cas complètement différent. Il semble que le manipulateur d'exception dans tensorflow l'a soulevé. Vous pouvez vérifier chaque ligne dans le Traceback. Dans mon cas , c'est arrivé dans tensorflow/python/lib/io/file_io.py
, parce que ce fichier contenait un bug différent, où self.__mode
et self.__name
n'étaient pas initialisés , et il fallait appeler self._FileIO__mode
, et self_FileIO__name
à la place.
quand j'ai eu ce problème avec tf.train.string_input_producer()
et tf.train.batch()
initialiser les variables locales avant de commencer le Coordonnateur a résolu le problème. J'ai eu l'erreur quand j'ai initialisé les variables locales après avoir lancé le coordinateur.