web-dev-qa-db-fra.com

FailedPreconditionError: Tentative d'utilisation sans initialisation dans Tensorflow

Je travaille actuellement sur le didacticiel TensorFlow , qui utilise un format "étrange" pour télécharger les données. J'aimerais utiliser le format NumPy ou pandas pour les données, afin de pouvoir le comparer aux résultats scikit-learn.

Je reçois les données de reconnaissance de chiffres de Kaggle: https://www.kaggle.com/c/digit-recognizer/data .

Voici le code du tutoriel TensorFlow (qui fonctionne très 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, extrait les variables cibles et les scinde en ensembles de données de test et d'apprentissage (tout cela fonctionne très 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, lorsque j'essaie de lancer l'étape de formation, je reçois une 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()

Des idées sur la façon dont je peux résoudre ce problème?

46
user3654387

La FailedPreconditionError survient parce que le programme tente de lire une variable (nommée "Variable_1") avant son initialisation. Dans TensorFlow, toutes les variables doivent être explicitement initialisées en exécutant leurs opérations "initializer". Pour plus de commodité, vous pouvez exécuter tous les initialiseurs de variable de la session en cours en exécutant l'instruction suivante avant votre boucle d'apprentissage:

tf.initialize_all_variables().run()

Notez que cette réponse suppose que, comme dans la question, vous utilisez tf.InteractiveSession, ce 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)
68
mrry

tf.initialize_all_variables() est obsolète. Initialisez plutôt les variables tensorflow avec: 

tf.global_variables_initializer()

Un exemple d'utilisation courant est:

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

Dans la documentation officielle, FailedPreconditionError

Cette exception est le plus souvent déclenchée lors de l'exécution d'une opération qui lit une variable avant de l'initialiser.

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()
  • initialisez les variables qui vous intéressent 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. N'oubliez pas que vous devriez l'insérer dans une session. Donc, vous obtiendrez quelque chose comme ceci:

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

Si vous souhaitez en savoir plus sur les variables, lisez cette documentation pour savoir comment report_uninitialized_variables et vérifier is_variable_initialized.

12
Salvador Dali

Cas d'utilisation différent, mais définissez votre session comme session par défaut a fait l'affaire 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ésolue. 

Mon cas d'utilisation est le suivant: 
1) stocke les keras VGG16 en tant que graphe de tensorflow 
2) charge kers VGG16 sous forme de graphique 
3) lance la fonction tf sur le graphique et obtient: 

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"]()]]
2
layser

J'ai reçu ce message d'erreur d'un cas complètement différent. Il semblait que le gestionnaire d'exceptions dans tensorflow le soulevait. Vous pouvez vérifier chaque ligne dans le traçage. Dans mon cas, cela s'est passé dans tensorflow/python/lib/io/file_io.py, car ce fichier contenait un autre bogue, où self.__mode et self.__name n'étaient pas initialisés et qu'il fallait appeler self._FileIO__mode et self_FileIO__name à la place. 

2
Tal

Lorsque j'ai eu ce problème avec tf.train.string_input_producer() et tf.train.batch() en initialisant les variables locales avant de commencer, le coordinateur a résolu le problème. J'avais eu l'erreur lorsque j'ai initialisé les variables locales après avoir démarré le coordinateur.

La FailedPreconditionError arrive parce que la session tente de lire une variable qui n’a pas été initialisée.

A partir de Tensorflow version 1.11.0, vous devez prendre ceci:

init_op = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init_op)
1
LaSul

Peut-être que quelque chose a changé dans les versions récentes de TensorFlow, car pour moi, exécuter

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

avant d’adapter des modèles semble faire l’affaire. La plupart des exemples et commentaires plus anciens semblent suggérer tf.global_variables_initializer().

0
wordsforthewise

Vous devez initialiser les variables avant de les utiliser.

Si vous essayez d'évaluer les variables avant de les initialiser, vous rencontrerez: FailedPreconditionError: Attempting to use uninitialized value tensor.

Le moyen le plus simple est d’initialiser toutes les variables en même temps en utilisant: tf.global_variables_initializer()

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

Vous utilisez tf.run(init) pour exécuter l’initialiseur, sans extraire aucune valeur.

Pour initialiser uniquement un sous-ensemble de variables, utilisez tf.variables_initializer() en répertoriant les variables:

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

Vous pouvez également initialiser chaque variable séparément en utilisant 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)
0
prosti