Tensorflow中的变量初始化错误

3

我正在跟随一个TensorFlow教程,运行以下代码时遇到了变量初始化错误:

num_points = 1000
vectors_set = []
for i in range(num_points):
         x1= np.random.normal(0.0, 0.55)
         y1= x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.03)
         vectors_set.append([x1, y1])

x_data = [v[0] for v in vectors_set]
y_data = [v[1] for v in vectors_set]
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

而生成的错误信息为:

FailedPreconditionError: Attempting to use uninitialized value Variable_3
     [[Node: Variable_3/read = Identity[T=DT_INT64, _class=["loc:@Variable_3"], _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_3)]]
Caused by op 'Variable_3/read', defined at:
  File "/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/runpy.py", line 184, in _run_module_as_main
    "__main__", mod_spec)
  File "/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/ipykernel/__main__.py", line 3, in <module>
    app.launch_new_instance()
  File "/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/traitlets/config/application.py", line 653, in launch_instance
    app.start()
  File "/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/ipykernel/kernelapp.py", line 474, in start
    ioloop.IOLoop.instance().start()
  File "/Users/ayada/anaconda/envs/tensorflow/lib/python3.5/site-packages/zmq/eventloop/ioloop.py", line 162, in start
    super(ZMQIOLoop, self).start()

有人能告诉我如何纠正这个问题吗?

相同的代码起作用了。我想我在Ipython笔记本中创建了多个具有相同名称的会话。如果创建多个tensorflow会话,是否会覆盖彼此并导致错误,请有人发表评论。 - Abhi
3个回答

2

可爱的...一个崩溃的自白,而不是一个错误消息。我怀疑你的设置中有些东西让你的正式TF变量悬挂了,可能是其中一个单字母名称。为了调试,我建议在每个初始化后插入一个简单的打印语句来报告计算出的值,或者至少是变量类型描述符。例如:

x_data = [v[0] for v in vectors_set]
y_data = [v[1] for v in vectors_set]
print (x_data, y_data)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
print (W)
b = tf.Variable(tf.zeros([1]))
print(b)
...

这不仅可以跟踪数据值,而且当程序再次崩溃时,你将有一个它停止的追踪 -- 这是你从上面得到的堆栈跟踪没有提供的更多信息。

是的,这很“肮脏”和低技术……但它会让你快速找到解决方案,除非你已经在此程序上启动了调试器。


2

您正在运行于一个IPython Notebook中,最好始终像这样限定图的构建和会话实例化的范围:

g = tf.Graph()
with g.as_default():
  ... build your graph ..

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

这将防止向默认图形添加相同的变量,并确保您始终拥有相同的图形。
为了更深入地理解问题:
如果您多次运行一个单元格,例如一些简单的操作:
a = tf.Variable()

每次在tf.default_graph()中创建一个新的变量。

通过创建新图形,作用域将防止这种情况发生。


感谢你的详细说明! - Abhi

0

问题出在这行代码tf.initialize_all_variables()上。这个方法已经被弃用,并且在2017-03-02之后被移除。

由于它已经被弃用,这意味着您的变量实际上没有初始化。

请尝试使用以下代码替代


init = tf.global_variables_initializer()
sess.run(init)

初始化变量仅适用于TensorFlow v1(TF1)。考虑使用TF2,因为变量在创建时立即初始化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接