我正在关注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()
有人可以告诉我如何纠正这个问题吗?
答案 0 :(得分:2)
可爱......一个崩溃的告白,而不是一个错误信息。我怀疑你的设置中有一些东西让你的一个正式TF变量挂起,可能是一个单字母的名字。要进行调试,我建议您在每次初始化后插入一个简单的 print 语句来报告计算的值,或者至少是变量类型描述符。例如:
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)
...
这不仅会跟踪数据值,而且当程序再次崩溃时,您将会看到它死亡的痕迹 - 您从上面的堆栈跟踪中获得的更多信息。
是的,这很脏,技术含量低......但是除非你已经在这个程序中启动了调试器,否则它会让你得到一个解决方案,除非你已经在这个程序中启动了调试器。
答案 1 :(得分:2)
你在ipython笔记本中运行,最好始终将图形的构造和会话实例化范围如下:
g = tf.Graph()
with g.as_default():
... build your graph ..
with tf.Session() as sess:
sess.run(...)
这样可以防止将相同的变量添加到默认图表中,并保证您始终拥有相同的图表。
进一步了解问题:
如果您多次运行一个单元格,比如
a = tf.Variable()
每次 NEW 变量时,它都会在tf.default_graph()
内创建。
范围界定会通过每次创建新图来防止这种情况。