如何使用TensorFlow读取并解码批量图像?当前仅能得到单张结果
解决TensorFlow队列读取全部元素的问题
这是因为你当前的代码每次调用sess.run(logits)只会从队列中取出单个样本进行处理,哪怕队列里有多个元素。要读取整个队列的所有元素,你可以用以下两种常见方法解决:
方法1:循环执行sess.run指定次数
既然你明确知道队列里有2个元素,直接循环调用sess.run对应次数即可,最后将结果合并:
# -------- Graph filename_queue = tf.train.string_input_producer([img_path, img_path]) image_reader = tf.WholeFileReader() key, image_file = image_reader.read(filename_queue) image = tf.image.decode_jpeg(image_file, channels=3) # Run my network logits = network.get_logits(image) # -------- Session sess = tf.Session() coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) # 循环读取队列中所有元素 logits_outputs = [] for _ in range(2): logits_outputs.append(sess.run(logits)) # 将结果合并为批量数组(可选,根据你的需求) import numpy as np logits_outputs = np.stack(logits_outputs) print(logits_outputs.shape) # 输出应为(2, ...),对应2个样本的结果 coord.request_stop() coord.join(threads) sess.close()
方法2:使用批量读取操作(更推荐)
如果以后需要处理更多样本,用tf.train.batch或tf.train.shuffle_batch直接从队列中读取批量数据,一次就能得到所有结果:
# -------- Graph # 设置num_epochs=1,确保队列只遍历一次所有元素,避免无限循环 filename_queue = tf.train.string_input_producer([img_path, img_path], num_epochs=1) image_reader = tf.WholeFileReader() key, image_file = image_reader.read(filename_queue) image = tf.image.decode_jpeg(image_file, channels=3) # 批量读取2个样本,capacity需大于等于batch_size batch_images = tf.train.batch([image], batch_size=2, capacity=2) # Run my network(注意此时输入是批量图片) logits = network.get_logits(batch_images) # -------- Session sess = tf.Session() coord = tf.train.Coordinator() # 必须初始化局部变量(num_epochs依赖局部变量) sess.run(tf.local_variables_initializer()) sess.run(tf.global_variables_initializer()) threads = tf.train.start_queue_runners(sess=sess, coord=coord) try: logits_output = sess.run(logits) print(logits_output.shape) # 输出应为(2, ...),对应批量结果 except tf.errors.OutOfRangeError: # 当队列遍历完num_epochs指定的次数后,会抛出这个异常 print("所有样本已处理完成") finally: coord.request_stop() coord.join(threads) sess.close()
关键注意点
- 使用
num_epochs时,必须调用tf.local_variables_initializer(),否则会触发变量未初始化的错误。 tf.train.batch的capacity参数要设置为大于等于batch_size,保证队列中有足够元素供批量读取。- 如果队列中是不同的图片路径,两种方法都完全适用,你当前的重复路径只是示例场景。
内容的提问来源于stack exchange,提问作者bluesummers
相关产品推荐
相关产品推荐

