1.报错内容:
OutOfRangeError (see above for traceback): RandomShuffleQueue '_1_shuffle_batch/random_shuffle_queue' is closed and has insufficient elements (requested 3, current size 0) [[Node: shuffle_batch = QueueDequeueManyV2[component_types=[DT_FLOAT, DT_FLOAT], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:CPU:0"](shuffle_batch/random_shuffle_queue, shuffle_batch/n)]]
2.问题说明
首先,初始该类问题表明程序本身并没有实质性的语法错误,其次,该报错是由shuffle_batch函数生成的
3.错误排查
(1)若显示:“requested 3, current size 1”表明数据还未读入,可尝试调小batch_size(随机出队列的数据量); 或者增大num_threads(线程数量)
(2)若显示:“requested 3, current size 1”则表示数据本身并没有读入,则可检查数据集是否有问题
比如:
①一个对象(行)应当有7个元素进行表示,却只有6个元素)
②按照指定格式读取数据,如[[1.0], [1.0], [1.0]], 却读取了数据标题行的字符型标题,导致数据无法读入,解决的方法有两个:①tf.TextLineReader()等函数读取数据时直接跳过第一行;②在原始数据中删除第一行,即删除第一行标题行
4.示例代码
import tensorflow as tf
import numpy as np
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
def readFile(filename):
filename_queue = tf.train.string_input_producer(filename, shuffle=False)
# 定义reader(逐行读取)
reader = tf.TextLineReader(skip_header_lines=1)
key, value = reader.read(filename_queue)
# 读取数据时对应的匹配类型
# [1.0]:float
# [1]:int
# ["null"]:string
record_defaults = [[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]]
# record_defaults = []
# for i in range(7):
# record_defaults.append([1.0])
col1, col2, col3, col4, col5, col6, col7 = tf.decode_csv(value, record_defaults=record_defaults)
# tf.stack:按照给定方向堆叠
label = tf.stack([col1, col2])
features = tf.stack([col3, col4, col5, col6, col7])
# 注意min_after_dequeue < capacity
example_batch, label_batch = tf.train.shuffle_batch([features, label], batch_size=3, capacity=100, min_after_dequeue=10)
return example_batch, label_batch
example_batch, label_batch = readFile(["cancer.txt"])
with tf.Session() as sess:
# 数据读取必须要创建线程协调器
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(5):
e_val, l_val = sess.run([example_batch, label_batch])
print(e_val)
coord.request_stop()
coord.join(threads)