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

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)

===============>>#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. 在其余计算密集型矩阵运算在GPU上运行的同时,在CPU中进行input data preprocessing 您的GPU利用率接近100%,这意味着瓶颈来自CPU无法加载足够的数据。
  3. 尝试保留较大的tfrecords而不是many tdrecords ,以便可以在不切换多个文件的情况下更快地顺序读取数据。
  4. 如果要处理图像,请不要将raw图像保存到tfrecords ,而应使用jpeg或类似格式,这样它们将占用更少的文件大小,并且可以更快地读取。 jpeg decode计算对于GPU来说是非常小的成本。

  ask by Sujoy Paul translate from so

未解决问题?本站智能推荐: