FailedPreconditionError:尝试在Tensorflow中使用未初始化

use*_*387 61 python classification pandas 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)
Run Code Online (Sandbox Code Playgroud)

在这里,我读取数据,去掉目标变量并将数据分成测试和训练数据集(这一切都正常):

# 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)
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试运行训练步骤时,我得到一个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})
Run Code Online (Sandbox Code Playgroud)

这是完整的错误:

---------------------------------------------------------------------------
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()
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法?

mrr*_*rry 79

之所以FailedPreconditionError出现是因为程序"Variable_1"在初始化之前尝试读取变量(已命名).在TensorFlow中,必须通过运行"初始化"操作来显式初始化所有变量.为方便起见,您可以通过在训练循环之前执行以下语句来运行当前会话中的所有变量初始值设定项:

tf.initialize_all_variables().run()
Run Code Online (Sandbox Code Playgroud)

请注意,此答案假设您正在使用的问题tf.InteractiveSession,这允许您在不指定会话的情况下运行操作.对于非交互式用途,更常见的是使用tf.Session和初始化如下:

init_op = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init_op)
Run Code Online (Sandbox Code Playgroud)

  • 请改用`tf.global_variables_initializer`,因为不推荐使用`tf.initialize_all_variables()`. (14认同)

use*_*836 51

tf.initialize_all_variables()已弃用.而是使用以下内容初始化tensorflow变量:

tf.global_variables_initializer()
Run Code Online (Sandbox Code Playgroud)

常见的用法是:

with tf.Session() as sess:
     sess.run(tf.global_variables_initializer())
Run Code Online (Sandbox Code Playgroud)

  • @ dv3与TensorFlow中的其他所有内容一样,创建操作和运行它之间存在差异.我认为这就是为什么"initialize_all_variables"被替换为"global_variables_initializer"的原因:名称"initialize_all_variables"听起来就像它一样,当它只创建操作时. (2认同)

Sal*_*ali 13

从官方文档,FailedPreconditionError

在运行在初始化之前读取tf.Variable的操作时,通常会引发此异常.

在您的情况下,错误甚至解释了未初始化的变量:Attempting to use uninitialized value Variable_1.其中一篇TF教程解释了很多变量,它们的创建/初始化/保存/加载

基本上初始化变量有3个选项:

我几乎总是使用第一种方法.记住你应该把它放在会话运行中.所以你会得到这样的东西:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
Run Code Online (Sandbox Code Playgroud)

如果您对有关变量的更多信息感到好奇,请阅读本文档以了解如何进行report_uninitialized_variables检查is_variable_initialized.