2015-11-30 3 views
29

Я работаю через tensor flow tutorial, но пытаюсь использовать формат numpy или pandas для данных, чтобы сравнить его с результатами Scikit-Learn.FailedPreconditionError: Попытка использования неинициализированного в Tensorflow

Я получаю данные распознавания цифр от kaggle - here

Учебник использует странный формат для загрузки данных, где, как я пытаюсь сравнить с результатами других библиотек, поэтому хотелось бы, чтобы держать его в numpy или pandas.

Вот стандартный код обучающая Тензор потока (это все работает отлично):

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

Здесь я прочитал данные, вычистить целевые переменные и разделить данные в испытательных и учебных наборов данных (все это работает штраф):

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

Теперь, когда я пытаюсь запустить шаг обучения, я получаю 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}) 

Вот полная ошибка:

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

Любые идеи, как я могу это исправить?

ответ

43

Причина: FailedPreconditionError возникает из-за того, что программа пытается прочитать переменную (с именем "Variable_1") до ее инициализации. В TensorFlow все переменные должны быть явно инициализированы, запустив их операции «инициализатор». Для удобства, вы можете запустить все переменные инициализаторы в текущем сеансе, выполнив следующую инструкцию перед вашим циклом обучения:

tf.initialize_all_variables().run() 

Обратите внимание, что этот ответ предполагает, что, как и в вопросе, вы используете tf.InteractiveSession, который позволяет запускать операции без указания сеанса. Для неинтерактивных применений, оно более распространено использование tf.Session, и инициализировать следующим образом:

init_op = tf.initialize_all_variables() 

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

Используйте 'tf.global_variables_initializer' вместо этого, потому что' tf.initialize_all_variables() 'будет устаревшим. – Beginner

23

tf.initialize_all_variables() является устаревшим. Вместо того, чтобы инициализировать tensorflow переменные с:

tf.global_variables_initializer() 

Типичным примером использования является:

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

В чем разница между sess.run (tf.global_variables_initializer()) и tf.global_variables_initializer()? вы часто видите последнее – dv3

+2

@ dv3, как и все остальное в TensorFlow, есть разница между созданием операции и ее запуском. Я думаю, именно поэтому «initialize_all_variables» был заменен на «global_variables_initializer»: имя «initialize_all_variables» звучит так, как будто оно делает это, когда оно только создает операцию. – mdaoust

+0

PLS Обратите внимание, что теперь метод tf.initialize_all_variables() –

8

Из официальной документации, FailedPreconditionError

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

В вашем случае ошибка даже объясняет, что переменная не была инициализирована : Attempting to use uninitialized value Variable_1. Один из учебников ТФ объясняет много о переменных, их creation/initialization/saving/loading

В основном для инициализации переменной у вас есть 3 варианта:

  • инициализировать все глобальные переменные с tf.global_variables_initializer()
  • инициализировать переменные, которые вы заботитесь о с tf.variables_initializer(list_of_vars).Обратите внимание на то, что вы можете использовать эту функцию, чтобы имитировать global_variable_initializer: tf.variable_initializers(tf.global_variables())
  • инициализировать только одну переменную с var_name.initializer

Я почти всегда использовать первый подход. Помните, что вы должны поместить его в сеанс. Таким образом, вы получите что-то вроде этого:

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

Если ваш интересно Дополнительные сведения о переменных, читайте this documentation знать, как report_uninitialized_variables и проверить is_variable_initialized.

1

Я получил это сообщение об ошибке из совершенно другого случая. Казалось, что обработчик исключений в тензорном потоке поднял его. Вы можете проверить каждую строку в Traceback. В моем случае это произошло в файле tensorflow/python/lib/io/file_io.py, потому что этот файл содержал другую ошибку, где self .__ mode и self .__ name не были инициализированы, и ему нужно было вызвать self._FileIO__mode и self_FileIO__name вместо ,

Смежные вопросы