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

Posted

技术标签:

【中文标题】FailedPreconditionError:尝试在 Tensorflow 中使用未初始化【英文标题】:FailedPreconditionError: Attempting to use uninitialized in Tensorflow 【发布时间】:2017-12-16 00:53:51 【问题描述】:

我正在处理TensorFlow tutorial,它使用“奇怪”的格式上传数据。我想对数据使用 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'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()

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

【问题讨论】:

【参考方案1】:

使用 tensorflow 版本 >3.2,您可以使用以下命令:

x1 = tf.Variable(5)
y1 = tf.Variable(3)

z1 = x1 + y1

init = tf.compat.v1.global_variables_initializer()
with tf.compat.v1.Session() as sess:
    init.run()
    print(sess.run(z1))

输出:8 会显示出来。

【讨论】:

【参考方案2】:

Tensorflow 2.0 兼容答案:在 Tensorflow 版本 >= 2.0 中,如果我们使用图形模式,则会显示初始化所有变量的命令,以修复 FailedPreconditionError下面:

tf.compat.v1.global_variables_initializer

这只是variables_initializer(global_variables())的快捷方式

它返回一个初始化图中全局变量的Op。

【讨论】:

即使在 2.3 中与 tf.data 一起使用时,我仍然会看到此错误。 ***.com/questions/64094061/…【参考方案3】:

你必须在使用它们之前初始化变量。

如果您在初始化变量之前尝试评估变量,您会遇到: 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)

【讨论】:

【参考方案4】:

最近的 TensorFlow 版本可能发生了一些变化,因为对我来说,正在运行

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

在拟合任何模型之前似乎可以解决问题。大多数较旧的示例和 cmets 似乎都建议使用tf.global_variables_initializer()

【讨论】:

【参考方案5】:

FailedPreconditionError 出现是因为会话正在尝试读取尚未初始化的变量。

Tensorflow 版本 1.11.0 开始,您需要这样做:

init_op = tf.global_variables_initializer()

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

【讨论】:

【参考方案6】:

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

tf.global_variables_initializer()

一个常见的示例用法是:

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

【讨论】:

sess.run(tf.global_variables_initializer()) 和 tf.global_variables_initializer() 有什么区别?你经常看到后者 @dv3 就像 TensorFlow 中的其他所有内容一样,创建操作和运行它是有区别的。我认为这就是为什么“initialize_all_variables”被替换为“global_variables_initializer”的原因:“initialize_all_variables”这个名字听起来像是它,当它只创建操作时。 请注意该方法现在是 tf.initialize_all_variables() @jesses.co.tt - 答案是正确的; tf.initialize_all_variables() 已弃用。见:tensorflow.org/api_docs/python/tf/initialize_all_variables @user3144836 的回答完美。就我而言,我将整个代码块封装在 with 例程下,从而清除了所有错误。谢谢。【参考方案7】:

我从完全不同的情况下收到此错误消息。似乎 tensorflow 中的异常处理程序引发了它。您可以检查 Traceback 中的每一行。在我的例子中,它发生在tensorflow/python/lib/io/file_io.py,因为这个文件包含一个不同的错误,其中self.__modeself.__name没有被初始化,它需要调用self._FileIO__modeself_FileIO__name

【讨论】:

【参考方案8】:

当我遇到tf.train.string_input_producer()tf.train.batch() 在启动之前初始化局部变量的问题时,协调器解决了这个问题。启动协调器后初始化局部变量时出现错误。

【讨论】:

【参考方案9】:

不同的用例,但将您的会话设置为默认会话对我有用:

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

【讨论】:

【参考方案10】:

来自官方文档,FailedPreconditionError

此异常最常在运行以下操作时引发 在初始化之前读取一个 tf.Variable。

在您的情况下,错误甚至解释了未初始化的变量:Attempting to use uninitialized value Variable_1。其中一个 TF 教程解释了很多关于变量的内容,他们的 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

【讨论】:

【参考方案11】:

出现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)

【讨论】:

改用tf.global_variables_initializer,因为tf.initialize_all_variables() 将被弃用。

以上是关于FailedPreconditionError:尝试在 Tensorflow 中使用未初始化的主要内容,如果未能解决你的问题,请参考以下文章

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

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

尝试在张量流上使用 RMSPropOptimizer 时出现 FailedPreconditionError

FailedPreconditionError:尝试使用未初始化的值

FailedPreconditionError:尝试使用未初始化的值Adam / lr

tensorflow.python.framework.errors_impl.FailedPreconditionError: Could not find variable var.