2015-11-30 10 views
29

Sto lavorando attraverso lo tensor flow tutorial, ma sto cercando di utilizzare un formato numerico o panda per i dati, in modo da poterlo confrontare con i risultati di Scikit-Learn.FailedPreconditionError: Tentativo di utilizzare uninitialized in Tensorflow

ottengo i dati di riconoscimento cifre da kaggle - here

Il tutorial utilizza un formato strano per il caricamento dei dati, dove, come sto cercando di confrontare con i risultati di altre biblioteche, in modo piacerebbe tenerlo in formato numpy o panda.

Ecco il codice esercitazione flusso tensore standard (questo tutto funziona bene):

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

Qui ho letto i dati, spellare le variabili target e suddividere i dati in set di dati di test e di formazione (questo tutte le opere fine):

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

Ora, quando si tenta di eseguire il passaggio di formazione, ottengo 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}) 

Ecco l'errore 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() 

Tutte le idee su come posso risolvere questo problema?

risposta

43

Il FailedPreconditionError si verifica perché il programma sta tentando di leggere una variabile (denominata "Variable_1") prima che sia stata inizializzata. In TensorFlow, tutte le variabili devono essere inizializzate esplicitamente, eseguendo le loro operazioni di "inizializzatore". Per comodità, è possibile eseguire tutte le inizializzatori variabili nella sessione corrente eseguendo la seguente dichiarazione prima del ciclo di formazione:

tf.initialize_all_variables().run() 

Si noti che questa risposta presuppone che, come nella questione, che si sta utilizzando tf.InteractiveSession, che consente di eseguire operazioni senza specificare una sessione. Per usi non interattive, è più comune l'uso tf.Session, e inizializzare come segue:

init_op = tf.initialize_all_variables() 

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

Utilizzare 'tf.global_variables_initializer' perché' tf.initialize_all_variables() 'sarà deprecato. – Beginner

23

tf.initialize_all_variables() è obsoleto. Invece inizializzare tensorflow variabili con:

tf.global_variables_initializer() 

Un uso comune esempio è:

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

qual è la differenza tra sess.run (tf.global_variables_initializer()) e tf.global_variables_initializer()? spesso vedi quest'ultimo come – dv3

+2

@ dv3 come tutto il resto in TensorFlow, c'è una differenza tra la creazione dell'operazione e l'esecuzione. Penso che sia per questo che "initialize_all_variables" è stato sostituito con "global_variables_initializer": il nome "initialize_all_variables" suona come fa, quando crea solo l'operazione. – mdaoust

+0

nota che il metodo è ora tf.initialize_all_variables() –

8

Da documentazione ufficiale, FailedPreconditionError

This exception is most commonly raised when running an operation that reads a tf.Variable before it has been initialized.

Nel tuo caso l'errore anche spiega cosa variabile non è stata inizializzata : Attempting to use uninitialized value Variable_1. Uno dei tutorial TF spiega molto di variabili, la loro creation/initialization/saving/loading

Fondamentalmente per inizializzare la variabile si hanno 3 opzioni:

  • inizializzare tutte le variabili globali con tf.global_variables_initializer()
  • inizializzare le variabili che ti interessano con tf.variables_initializer(list_of_vars).Si noti che è possibile utilizzare questa funzione per imitare global_variable_initializer: tf.variable_initializers(tf.global_variables())
  • inizializzare una sola variabile con var_name.initializer

io uso quasi sempre il primo approccio. Ricorda che dovresti metterlo in una sessione di sessione. Così si ottiene qualcosa di simile:

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

Se il vostro sono curiosi di sapere ulteriori informazioni sulle variabili, leggere this documentation saper report_uninitialized_variables e verificare is_variable_initialized.

1

Ho ricevuto questo messaggio di errore da un caso completamente diverso. Sembrava che il gestore delle eccezioni di tensorflow l'avesse sollevato. Puoi controllare ciascuna riga nel Traceback. Nel mio caso è successo in tensorflow/python/lib/io/file_io.py perché questo file conteneva un bug diverso, dove la modalità self .__ e il nome self .__ non erano inizializzati, e aveva bisogno di chiamare self._FileIO__mode, e self_FileIO__name .