データセットを10個のtfrecordsファイルに分割し、100個のデータポイントを読み込み、10個のデータポイントの10個のシーケンスのバッチを作成したいと考えています。私はそれを行うために、次の関数を使用します。 tfrecordsからのデータ読み込み時間は遅くなり、約0.65sに達し、100-200回後にsess.run呼び出しは約10秒に増加します。読み込み時間を短縮するのに役立つ間違いや示唆を指摘してください。また、私が言及した振る舞いは時にはより不安定になる。TFRecordの読み取りが遅くなる
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)
私が次のように1つのファイルから取得している場合でも、私は同じ動作を観察しています。さらに、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)
シーケンスを作成するために、各tfrecordsファイルから100個の連続した例を取得したいと思います。次に、10個の異なるtfrecordファイルから10個のそのようなシーケンスを取り出し、バッチを作成したいと思います。私がtf.train.shuffle_batchを使用すると、100のシーケンス内でシャッフルされます。私はそれが時間的な情報を失うので望ましくありません。また、50GBごとに10個のtfrecordファイルがあります。さらに、私はjpegファイルをロードしようとしていませんが、テンソルはフィーチャとしてロードしようとしています。私はあなたが私の状況を願っています。 –
シャッフルバッチは使用しないでください。シャッフルしたくない場合は、tf.train.batchを使用できます。一時的な情報を使用している場合、なぜそれらを1つのレコードとして一緒に保管することはできません。 https://stackoverflow.com/questions/44464828/tfrecords-write-list-of-tensors-to-single-example/44479764#44479764 –
あなたが私が言及した形式でバッチを作成する方法を助けてくれますか? tf、train.batchを使用して、つまり複数のファイルから読み込んでバッチを作成しますか?私は100の機能を1つのシーケンスとしてtfrecordsに保存することはできません。シーケンスの数を重複させたいので制限し、重複して保存すると大量のスペースが必要になります。 –