代码顺序会影响最终结果

时间:2016-08-26 08:14:19

标签: tensorflow

我遇到了代码顺序影响最终结果的问题。首先,代码工作。移动一行后,tensorflow会生成错误。

例如,

工作版:

probs = net.get_output()
label_node = tf.placeholder(tf.int32, name='label_node')
top_1_op = tf.nn.in_top_k(probs, label_node, 1)
top_5_op = tf.nn.in_top_k(probs, label_node, 5)
threads = image_producer.start(session=sess, coordinator=coordinator)
for (labels, images) in image_producer.batches(sess):
    top_1_result, top_5_result = sess.run([top_1_op, top_5_op],
                                    feed_dict={input_node: images, label_node: labels})  

非工作版本:

threads = image_producer.start(session=sess, coordinator=coordinator)   # move here
probs = net.get_output()
label_node = tf.placeholder(tf.int32, name='label_node')
top_1_op = tf.nn.in_top_k(probs, label_node, 1)
top_5_op = tf.nn.in_top_k(probs, label_node, 5)
for (labels, images) in image_producer.batches(sess):
    top_1_result, top_5_result = sess.run([top_1_op, top_5_op],
                                    feed_dict={input_node: images, label_node: labels})

Tensorflow会产生错误

"tensorflow.python.framework.errors.NotFoundError: FeedInputs: unable to find feed output label_node:0".  

如您所见,tensorflow应该能够找到“label_node:0”。实际上,tensorflow也找不到top_1_optop_5_op

image_producer.start的内容类似于:

op_A = ...
queue_runner = tf.train.QueueRunner(queue_B, [op_B] * num_concurrent)
session.run(op_A)
t = queue_runner.create_threads(session, coord=coordinator, start=True)

更奇怪的是,在非工作版本中,在image_producer.start中添加两行之后,代码再次起作用。例如,image_producer.start变为

op_C = ...  # new
session.run(op_C)  # new
op_A = ...
queue_runner = tf.train.QueueRunner(queue_B, [op_B] * num_concurrent)
session.run(op_A)
t = queue_runner.create_threads(session, coord=coordinator, start=True)

有没有人知道这个问题的可能原因?或者有关如何调试这个的想法?

1 个答案:

答案 0 :(得分:1)

听起来你正在遭遇TensorFlow 0.9.0发布后修复的bug。在该版本(及更早版本)中,TensorFlow遇到竞争条件,如果在队列运行程序(或其他调用sess.run()的线程)启动后修改了图形,则可能导致不可恢复的错误。 0.9.0版本中唯一的解决方法是启动 队列运行器(即代码中的image_producer图形完全构建完毕后。