TensorFlow中使用tf.train.batch无输出且进程持续运行,求排查方案
解决tf.train.batch运行无输出且进程一直阻塞的问题
我之前确实碰到过一模一样的情况,这在TensorFlow 1.x的队列机制里是个很典型的新手坑——核心原因就是你只创建了输入队列,但没启动线程给队列填充数据,程序就一直卡在等待数据的状态,自然不会有输出,还会一直跑着。
先拆解下你的代码问题:
- 你用
tf.train.slice_input_producer创建了切片队列,但没有配套的线程管理器来驱动队列加载数据,队列始终是空的,后续不管是取单条数据还是做batch,都会无限阻塞。 - 你的代码里
sess.run(tf.global_variables_initi...应该是没写完,完整的写法是tf.global_variables_initializer(),不过这不是导致阻塞的关键。
给你修正后的完整测试代码,亲测可以正常输出:
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import numpy as np import tensorflow as tf a = [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]] b = [1,2,3,4] # 创建切片输入队列 input_queue = tf.train.slice_input_producer([a, b], num_epochs=None, shuffle=False) # 生成batch数据,这里设置batch大小为2 batch_data = tf.train.batch(input_queue, batch_size=2, num_threads=1, capacity=4) with tf.Session() as sess: # 初始化所有变量(包括队列内部的状态变量) sess.run(tf.global_variables_initializer()) # 启动队列线程管理器,这是让队列动起来的关键! coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) try: # 循环获取2次batch数据做测试 for _ in range(2): batch_a, batch_b = sess.run(batch_data) print("Batch a:", batch_a) print("Batch b:", batch_b) except tf.errors.OutOfRangeError: print("所有数据已处理完毕") finally: # 停止线程,避免资源泄漏 coord.request_stop() coord.join(threads)
几个必须注意的关键点:
- 一定要用
tf.train.Coordinator()和tf.train.start_queue_runners()启动线程,这是给队列喂数据的动力源,缺了它队列就是个空架子,程序会一直等数据。 - 记得捕获
OutOfRangeError,如果设置了num_epochs参数,当队列里的数据被全部取完时会抛出这个异常,需要用它来终止循环并停止线程。 tf.train.batch的capacity参数要设置得合理,至少要大于等于batch_size,避免队列出现空转阻塞。
哪怕你只是测试slice_input_producer不取batch,直接跑sess.run(input_queue),也必须启动队列线程才能拿到数据哦。
内容的提问来源于stack exchange,提问作者Jingjue.Wei
相关产品推荐
相关产品推荐

