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?
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)
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())
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:
tf.global_variables_initializer()
tf.variables_initializer(list_of_vars)
. Notez que vous pouvez utiliser cette fonction pour imiter global_variable_initializer: tf.variable_initializers(tf.global_variables())
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
.
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"]()]]
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.
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)
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()
.
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)