Подтвердить что ты не робот

FailedPreconditionError: попытка использовать uninitialized в Tensorflow

Я работаю через учебник TensorFlow, который использует "странный" формат для загрузки данных. Я хотел бы использовать для данных формат NumPy или pandas, чтобы я мог сравнить его с результатами scikit-learn.

Я получаю данные распознавания цифр от Kaggle: https://www.kaggle.com/c/digit-recognizer/data.

Вот код из учебника TensorFlow (который отлично работает):

# 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 graph is different from the session "
   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()

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

4b9b3361

Ответ 1

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)

Ответ 2

tf.initialize_all_variables() устарела. Вместо этого инициализируйте переменные tenorflow с помощью:

tf.global_variables_initializer()

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

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

Ответ 3

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

Это исключение чаще всего возникает при выполнении операции, которая читает tf.Variable до того, как он был инициализирован.

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

В принципе, для инициализации переменной у вас есть 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())

Если вам интересно узнать больше о переменных, прочитайте эту документацию, чтобы узнать, как report_uninitialized_variables и проверить is_variable_initialized.

Ответ 4

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

Ответ 5

Другой вариант использования, но установка сеанса в качестве сеанса по умолчанию сделала свое дело:

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

Это одна из таких ошибок, которая становится очевидной, если вы ее решили.

Мой вариант использования следующий:
1) хранить keras VGG16 в виде тензорного графика
2) загрузить kers VGG16 в виде графика
3) запустите функцию tf на графике и получите:

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

Ответ 6

Когда у меня возникла эта проблема с tf.train.string_input_producer() и tf.train.batch() инициализирующими локальные переменные перед тем, как я начал, Координатор решил проблему. Я получал ошибку, когда инициализировал локальные переменные после запуска Координатора.

Ответ 7

FailedPreconditionError возникает потому, что сеанс пытается прочитать переменную, которая не была инициализирована.

Начиная с версии Tensorflow 1.11.0, вам нужно принять это:

init_op = tf.global_variables_initializer()

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

Ответ 8

Вы должны инициализировать переменные перед их использованием.

Если вы попытаетесь оценить переменные перед их инициализацией, вы FailedPreconditionError: Attempting to use uninitialized value tensor.

Самый простой способ - инициализировать все переменные одновременно, используя: tf.global_variables_initializer()

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

Вы используете sess.run(init) для запуска инициализатора без извлечения какого-либо значения.

Чтобы инициализировать только подмножество переменных, вы используете tf.variables_initializer() перечисляющий переменные:

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

Вы также можете инициализировать каждую переменную отдельно, используя 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:
    sess.run(W.initializer)

Ответ 9

Возможно, что-то изменилось в последних сборках TensorFlow, потому что для меня работает

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

перед установкой любой модели, кажется, делает свое дело. Большинство старых примеров и комментариев, кажется, предлагают tf.global_variables_initializer().