2017-07-08 5 views
0

データセットを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) 

答えて

0

は、私はあなたがミニバッチを自分で作成しようとしているが、代わりにあなたはあなたのためにそれを行うにはtf.train.shuffle_batchまたはtf.train.batchようtensorflowキューを使用すべきだと思います。

ご入力の流れは次のようにする必要があります:あなたのデータのロード時間を改善するために

# 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. のparam MIN_AFTER_DEQUEUEを設定することが重要です。大きな数値に設定すると、起動が遅くなり、メモリが増えますが、実行時間は長くなります。
  2. CPUでinput data preprocessingを実行し、残りの計算集約型マトリックス演算はGPUで実行します。 GPUの使用率が100%に近くない場合は、CPUのボトルネックが十分なデータをロードしていないことを意味します。
  3. manytdrecordsの代わりにtfrecordsを大きくしてください。これにより、複数のファイルを切り替えることなくデータを順番に高速に読み取ることができます。
  4. イメージを扱う場合、イメージをtfrecordsに保存しないでください。jpegまたはそれに類するフォーマットを使用して、ファイルサイズが小さくなり、読み込み速度が向上します。 jpeg decodeの計算は、GPUの場合は非常にわずかです。
+0

シーケンスを作成するために、各tfrecordsファイルから100個の連続した例を取得したいと思います。次に、10個の異なるtfrecordファイルから10個のそのようなシーケンスを取り出し、バッチを作成したいと思います。私がtf.train.shuffle_batchを使用すると、100のシーケンス内でシャッフルされます。私はそれが時間的な情報を失うので望ましくありません。また、50GBごとに10個のtfrecordファイルがあります。さらに、私はjpegファイルをロードしようとしていませんが、テンソルはフィーチャとしてロードしようとしています。私はあなたが私の状況を願っています。 –

+0

シャッフルバッチは使用しないでください。シャッフルしたくない場合は、tf.train.batchを使用できます。一時的な情報を使用している場合、なぜそれらを1つのレコードとして一緒に保管することはできません。 https://stackoverflow.com/questions/44464828/tfrecords-write-list-of-tensors-to-single-example/44479764#44479764 –

+0

あなたが私が言及した形式でバッチを作成する方法を助けてくれますか? tf、train.batchを使用して、つまり複数のファイルから読み込んでバッチを作成しますか?私は100の機能を1つのシーケンスとしてtfrecordsに保存することはできません。シーケンスの数を重複させたいので制限し、重複して保存すると大量のスペースが必要になります。 –

関連する問題