第一次运行后,读取Tensorflow记录文件不起作用
我有一小段代码从一些TFRecord文件中读取数据。如果我从ipython笔记本上运行代码,那么在我第一次执行块时,它就可以正常工作。但是,如果在不重新启动内核的情况下再次尝试执行同一代码块,则会产生错误(错误:StatusNotOK:Not found:FetchOutputs node DecodeRaw_2:0:Not found)。代码如下所示。我是否需要关闭/清除/重新初始化某些内容才能使代码正确运行多次第一次运行后,读取Tensorflow记录文件不起作用,tensorflow,Tensorflow,我有一小段代码从一些TFRecord文件中读取数据。如果我从ipython笔记本上运行代码,那么在我第一次执行块时,它就可以正常工作。但是,如果在不重新启动内核的情况下再次尝试执行同一代码块,则会产生错误(错误:StatusNotOK:Not found:FetchOutputs node DecodeRaw_2:0:Not found)。代码如下所示。我是否需要关闭/清除/重新初始化某些内容才能使代码正确运行多次 filename_queue = tf.train.string_input_p
filename_queue = tf.train.string_input_producer(filename_list)
init = tf.initialize_all_variables()
image = []
label = []
with tf.Session() as sess:
sess.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
tf_image, tf_label = read_and_decode(filename_queue)
for i in range(len(filename_list)):
image.append(sess.run(tf_image))
label.append(sess.run(tf_label))
coord.request_stop()
coord.join(threads)
请注意,默认情况下,read_和_decode()取自。命令使用新名称附加到默认图形。在第二次运行代码段之前,可以使用tf.reset\u default\u graph()清除默认图形。默认情况下为tf。命令使用新名称附加到默认图形。在第二次运行代码段之前,可以使用tf.reset\u default\u graph()清除默认图形。问题代码中存在一些问题
with tf.Graph().as_default(): # Declares a new graph for the life of the block.
filename_queue = tf.train.string_input_producer(filename_list)
init = tf.initialize_all_variables()
image = []
label = []
with tf.Session() as sess:
# ...
coord.join(threads)
sess.run(tf\u image)
和sess.run(tf\u label)
意味着图像和标签之间的关联丢失。调用sess.run(tf_-image)
时,您从读卡器中获取图像和标签,但丢弃标签(反之亦然,对于sess.run(tf_-label)
。正确的解决方案是在同一步骤中获取它们:
image_val, label_val = sess.run([tf_image, tf_label])
image.append(image_val)
label.append(label_val)
tf.train.start\u queue\u runners()后将节点添加到图形中
。TensorFlow图上可能存在数据争用,因为它会向图中添加节点,而并行队列运行程序会同时读取它,tf.graph
不是线程安全的
处理此问题的最佳方法是在启动队列运行程序之前定义所有图形:
with tf.Graph().as_default():
filename_queue = tf.train.string_input_producer(filename_list)
image = []
label = []
tf_image, tf_label = read_and_decode(filename_queue)
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(len(filename_list)):
image_val, label_val = sess.run([tf_image, tf_label])
image.append(image_val)
label.append(label_val)
coord.request_stop()
coord.join(threads)
问题代码中有几个问题
with tf.Graph().as_default(): # Declares a new graph for the life of the block.
filename_queue = tf.train.string_input_producer(filename_list)
init = tf.initialize_all_variables()
image = []
label = []
with tf.Session() as sess:
# ...
coord.join(threads)
sess.run(tf\u image)
和sess.run(tf\u label)
意味着图像和标签之间的关联丢失。当调用sess.run(tf\u image)
时,您从读卡器中使用图像和标签,但丢弃标签(反之亦然,调用sess.run(tf\u label)
。正确的解决方案是在同一步骤中获取它们:
image_val, label_val = sess.run([tf_image, tf_label])
image.append(image_val)
label.append(label_val)
tf.train.start\u queue\u runners()后将节点添加到图形中
。TensorFlow图上可能存在数据争用,因为它会向图中添加节点,而并行队列运行程序会同时读取它,tf.graph
不是线程安全的
处理此问题的最佳方法是在启动队列运行程序之前定义所有图形:
with tf.Graph().as_default():
filename_queue = tf.train.string_input_producer(filename_list)
image = []
label = []
tf_image, tf_label = read_and_decode(filename_queue)
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(len(filename_list)):
image_val, label_val = sess.run([tf_image, tf_label])
image.append(image_val)
label.append(label_val)
coord.request_stop()
coord.join(threads)
在第二次运行代码段之前,请尝试
tf.reset\u default\u graph()
。感谢您的快速响应。尝试tf.reset\u default\u graph())
在第二次运行代码片段之前,它成功了!感谢您的快速响应。非常棒的答案!感谢您的详细评论。我学到了很多!非常棒的答案!感谢您的详细评论。我学到了很多!