0

我已将数据集划分为 10 个 tfrecords 文件,我想从每个文件中读取 100 个数据点,以创建一批 10 个 100 个数据点的序列。我使用以下函数来做到这一点。来自 tfrecords 的数据加载时间开始缓慢,然后达到大约 0.65 秒,在 100-200 sess.run 调用后增加到大约 10 秒。您能否指出任何可能有助于减少阅读时间的错误或建议?此外,我提到的行为有时会变得更加不稳定。

def get_data(mini_batch_size):
  data = []
  for i in range(mini_batch_size):
    filename_queue = tf.train.string_input_producer([data_path + 'Features' + str(i) + '.tfrecords'])
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read_up_to(filename_queue,step_size)
    features = tf.parse_example(serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
    feature = features['feature_raw'].values
    feature = tf.reshape(feature,[step_size, ConvLSTM.H, ConvLSTM.W, ConvLSTM.Di])
    data.append(feature)
  return tf.stack(data)

即使我按如下方式从单个文件中提取,我也观察到相同的行为。此外,增加 num_threads 也无济于事。

 with tf.device('/cpu:0'):
   filename_queue = tf.train.string_input_producer(['./Data/TFRecords/Features' + str(i) + '.tfrecords'])
   reader = tf.TFRecordReader()
   _, serialized_example = reader.read(filename_queue)
   batch_serialized_example = tf.train.batch([serialized_example], batch_size=100, num_threads=1, capacity=100)
   features = tf.parse_example(batch_serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
   feature = features['feature_raw'].values
   data.append(feature)
data = tf.stack(data)

init_op = tf.group(tf.global_variables_initializer(),tf.local_variables_initializer())
sess = tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1,allow_soft_placement=True))
sess.run(init_op)

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

for i in range(1000):
   t = time.time()
   D = sess.run(data)
   print(time.time()-t)
4

1 回答 1

0

我认为您正在尝试自己创建小批量,但您应该使用类似或为您创建的tensorflow队列。tf.train.shuffle_batchtf.train.batch

您的输入流程应如下所示:

# Create a filename queue: Read tfrecord filenames 
filename_queue = tf.train.string_input_producer

#Create reader to populate the queue of examples
reader = tf.TFRecordReader()
_, serialized_example = reader.read_up_to(filename_queue,step_size)

#Parses the example proto 
features = tf.parse_example(serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
feature = features['feature_raw'].values
feature = tf.reshape(feature,[step_size, ConvLSTM.H, ConvLSTM.W, ConvLSTM.Di])

## Shuffling queue that creates batches of data
features = tf.train.shuffle_batch([feature], batch_size=batch_size, num_threads=2, capacity=MIN_AFTER_DEQUEUE + 3*batch_size, min_after_dequeue=MIN_AFTER_DEQUEUE)

为了改善您的数据加载时间,以下几点将对您有所帮助:

  1. 设置参数MIN_AFTER_DEQUEUE很重要。将其设置为较大的数字将具有较慢的启动速度和更多的内存,但运行时间数字会更好。
  2. input data preprocessingCPU 中执行其余计算密集型矩阵运算在 GPU 上运行。您的 GPU 利用率未接近 100%,这意味着瓶颈来自 CPU 没有加载足够的数据。
  3. 尽量保持较大tfrecords而不是many tdrecords,这样可以在不切换多个文件的情况下更快地顺序读取数据。
  4. 如果您处理图像,请不要将raw图像保存为tfrecords使用jpeg或类似格式,这样它们将占用更少的文件大小并且可以更快地读取。计算jpeg decode对于GPU.
于 2017-07-08T17:21:45.110 回答