it-swarm.com.de

FailedPreconditionError: Versuch, in Tensorflow nicht initialisiert zu verwenden

Ich arbeite durch das TensorFlow-Tutorial , das ein "komisches" Format verwendet, um die Daten hochzuladen. Ich möchte das NumPy- oder Pandas-Format für die Daten verwenden, damit ich es mit den Ergebnissen von Scikit-Learn vergleichen kann.

Ich bekomme die Ziffernerkennungsdaten von Kaggle: https://www.kaggle.com/c/digit-recognizer/data .

Hier der Code aus dem TensorFlow-Tutorial (der gut funktioniert):

# 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)

Hier lese ich die Daten, entpacke die Zielvariablen und teile die Daten in Test- und Trainingsdatensätze auf (alles funktioniert gut):

# 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)

Wenn ich jetzt versuche, den Trainingsschritt auszuführen, erhalte ich eine 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})

Hier ist der volle Fehler:

---------------------------------------------------------------------------
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()

Irgendwelche Ideen, wie ich das beheben kann?

46
user3654387

Die Variable FailedPreconditionError entsteht, weil das Programm versucht, eine Variable ("Variable_1") zu lesen, bevor sie initialisiert wurde. In TensorFlow müssen alle Variablen explizit initialisiert werden, indem ihre "Initialisierungsoperationen" ausgeführt werden. Zur Vereinfachung können Sie alle Variableninitialisierer in der aktuellen Sitzung ausführen, indem Sie die folgende Anweisung vor Ihrer Trainingsschleife ausführen:

tf.initialize_all_variables().run()

Beachten Sie, dass bei dieser Antwort davon ausgegangen wird, dass Sie wie in der Frage tf.InteractiveSession verwenden, wodurch Sie Operationen ohne Angabe einer Sitzung ausführen können. Für nicht interaktive Anwendungen wird tf.Session verwendet und wie folgt initialisiert:

init_op = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init_op)
68
mrry

tf.initialize_all_variables() ist veraltet. Initialisieren Sie Tensorflow-Variablen stattdessen mit: 

tf.global_variables_initializer()

Ein übliches Beispiel ist:

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

Aus der offiziellen Dokumentation FailedPreconditionError

Diese Ausnahme wird am häufigsten ausgelöst, wenn eine Operation ausgeführt wird, die liest eine tf.Variable, bevor sie initialisiert wurde.

In Ihrem Fall erklärt der Fehler sogar, welche Variable nicht initialisiert wurde: Attempting to use uninitialized value Variable_1. In einem der TF-Tutorials wird viel über Variablen, ihre Erstellung/Initialisierung/Speicherung/Laden erklärt.

Um die Variable zu initialisieren, haben Sie 3 Optionen:

  • initialisiert alle globalen Variablen mit tf.global_variables_initializer()
  • initialisieren Sie Variablen, die Ihnen wichtig sind, mit tf.variables_initializer(list_of_vars) . Beachten Sie, dass Sie diese Funktion verwenden können, um global_variable_initializer nachzuahmen: tf.variable_initializers(tf.global_variables())
  • nur eine Variable mit var_name.initializer initialisieren

Ich verwende fast immer den ersten Ansatz. Denken Sie daran, dass Sie es in einen Sitzungslauf stellen sollten. So wirst du so etwas bekommen:

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

Wenn Sie mehr über Variablen erfahren möchten, lesen Sie diese Dokumentation , um zu wissen, wie report_uninitialized_variables und is_variable_initialized geprüft werden.

12
Salvador Dali

Anderer Anwendungsfall, aber Sie sollten Ihre Sitzung als Standardsitzung festlegen, was für mich der Trick war:

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

Dies ist einer dieser Fehler, der so offensichtlich ist, wenn Sie ihn gelöst haben. 

Mein Anwendungsfall ist folgender: 
1) Speichern Sie die Keras VGG16 als Tensorflussdiagramm 
2) Laden Sie VGG16 als Grafik 
3) Führen Sie die Funktion tf im Diagramm aus und erhalten Sie: 

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

Ich habe diese Fehlermeldung aus einem völlig anderen Fall erhalten. Es schien, dass der Ausnahmebehandler im Tensorflow es angehoben hat. Sie können jede Zeile im Traceback überprüfen. In meinem Fall passierte es in tensorflow/python/lib/io/file_io.py, da diese Datei einen anderen Fehler enthielt, bei dem self.__mode und self.__name nicht initialisiert wurden und stattdessen self._FileIO__mode und self_FileIO__name aufgerufen werden mussten. 

2
Tal

Als ich dieses Problem mit tf.train.string_input_producer() und tf.train.batch() hatte, bevor die lokalen Variablen initialisiert wurden, löste der Koordinator das Problem. Ich hatte den Fehler erhalten, als ich die lokalen Variablen nach dem Starten des Koordinators initialisierte.

Der FailedPreconditionError kommt, weil die Sitzung versucht, eine Variable zu lesen, die nicht initialisiert wurde.

Ab Tensorflow Version 1.11.0 müssen Sie Folgendes annehmen:

init_op = tf.global_variables_initializer()

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

Möglicherweise hat sich in den letzten TensorFlow-Builds etwas geändert, denn für mich läuft

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

vor dem Anpassen von Modellen scheint der Trick zu funktionieren Die meisten älteren Beispiele und Kommentare deuten auf tf.global_variables_initializer() hin.

0
wordsforthewise

Sie müssen Variablen vor der Verwendung initialisieren.

Wenn Sie versuchen, die Variablen auszuwerten, bevor Sie sie initialisieren, werden Sie folgendermaßen ausgeführt: FailedPreconditionError: Attempting to use uninitialized value tensor.

Der einfachste Weg ist das Initialisieren aller Variablen auf einmal mit: tf.global_variables_initializer()

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

Sie verwenden tf.run(init), um den Initialisierer auszuführen, ohne einen Wert abzurufen.

Um nur eine Teilmenge von Variablen zu initialisieren, verwenden Sie tf.variables_initializer(), um die Variablen aufzulisten:

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

Sie können jede Variable auch separat mit tf.Variable.initializer initialisieren.

# 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