在 Tensorflow 尝试使用未初始化

我正在使用 TensorFlow 教程,它使用一种“奇怪”的格式来上传数据。我希望对数据使用 NumPy 或熊猫格式,这样我就可以将其与 scikit-learn 结果进行比较。

我从 Kaggle 得到数字识别数据。

以下是 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()

有什么办法能让我解决这个问题吗?

115671 次浏览

出现 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.initialize_all_variables()。而是使用以下方法初始化张量流变量:

tf.global_variables_initializer()

一个常见的例子是:

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

从官方文件,失败预处理错误

此异常通常在运行以下操作时引发 在初始化之前读取 tf 变量。

在您的例子中,错误甚至解释了哪个变量没有被初始化: Attempting to use uninitialized value Variable_1。TF 教程之一解释了很多关于变量的内容,它们的 创建/初始化/保存/加载

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

我几乎总是用第一种方法。记住,应该将它放在会话运行中。所以你会得到这样的结果:

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

如果您对变量的更多信息感兴趣,请阅读 这份文件以了解如何使用 report_uninitialized_variables并检查 is_variable_initialized

我从一个完全不同的案例中得到了这个错误消息。似乎是张量流中的异常处理程序引发了它。您可以在“追溯”中检查每一行。在我的例子中,它发生在 tensorflow/python/lib/io/file_io.py中,因为这个文件包含一个不同的 bug,其中没有初始化 self.__modeself.__name,它需要调用 self._FileIO__mode,而调用 self_FileIO__name

不同的用例,但是将你的会话设置为默认会话对我来说很有用:

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

一旦你解决了这个问题,这个错误就显而易见了。

我的用例如下:
1)将 Keras VGG16存储为张量流图
2)以 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"]()]]

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

失败预处理错误出现是因为会话试图读取一个尚未初始化的变量。

张量流1.11.0版本开始,你需要这样做:

init_op = tf.global_variables_initializer()


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

在使用变量之前,必须对它们进行初始化

如果你尝试在初始化变量之前计算它们,你会遇到: 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)

在最近的 TensorFlow 构建中,可能发生了一些变化,因为对我来说,运行

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

在适合任何模型之前似乎都可以做到这一点。大多数旧的例子和评论似乎建议 tf.global_variables_initializer()

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

tf.compat.v1.global_variables_initializer

这只是 variables_initializer(global_variables())的一条捷径

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

对于张量流版本 > 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 将会显示。