データセットを 10 個の tfrecords ファイルに分割しました。それぞれから 100 個のデータ ポイントを読み取って、100 個のデータ ポイントの 10 シーケンスのバッチを作成したいと考えています。そのために次の関数を使用します。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)