2017-04-03 64 views
4

我想問一下使用tensorflow批量讀取大文本數據的正確模式?Tensorflow - 從單個大文本文件中讀取數據的正確方法

這是一行文本數據。單個txt文件中有數十億行這樣的數據。

target context label

現在我想tfrecords使用官方文檔中建議。

這裏是我的方式

filename_queue = tf.train.string_input_producer([self._train_data], num_epochs=self._num_epochs) 

    reader = tf.TFRecordReader() 

    _, serialized_example = reader.read(filename_queue) 

    features = tf.parse_single_example(
     serialized_example, 
     # Defaults are not specified since both keys are required. 
     features={ 
      'target': tf.FixedLenFeature([], tf.int64), 
      'context': tf.FixedLenFeature([], tf.int64), 
      'label': tf.FixedLenFeature([], tf.int64), 
     }) 

    target = features['target'] 
    context = features['context'] 
    label = features['label'] 
    min_after_dequeue = 10000 
    capacity = min_after_dequeue + 3 * self._batch_size 
    target_batch, context_batch, label_batch = tf.train.shuffle_batch(
     [target, context, label], batch_size=self._batch_size, capacity=capacity, 
     min_after_dequeue=min_after_dequeue, num_threads=self._concurrent_steps) 

之後,我用時間線做分析。結果表明這部分大部分時間都在使用。 這裏是剖析圖。 the profiling result

Btw。我正在使用批量大小500. 有什麼建議嗎?

+0

您的CPU是否已滿載?如果不是,則可能需要使用更多線程(在'tf.train.shuffle_batch()'的'num_threads'參數中)解析文件中的記錄。其他可能性:你可以使用'reader.read_up_to(n)',''tf.parse_example()'而不是'tf.parse_single_example()',並且通過'enqueue_many = True'將'tf.train.shuffle_batch()'傳入爲了執行批量解析,這應該更有效率。 – mrry

+1

@mrry這就是它我使用'reader.read_up_to(n)',''tf.parse_example()'每次讀取多行並解決問題。 –

回答

0

它往往是更高效的應用tf.parse_example()到一批元件,而不是每個單獨的元件上施加tf.parse_single_example(),因爲前者運算具有高效的多線程執行時,輸入包含多個實例可以使用的。以下代碼重寫應該會提高性能:

filename_queue = tf.train.string_input_producer([self._train_data], num_epochs=self._num_epochs) 

reader = tf.TFRecordReader() 

# Read a batch of up to 128 examples at once. 
_, serialized_examples = reader.read_up_to(filename_queue, 128) 

features = tf.parse_example(
    serialized_examples, 
    # Defaults are not specified since both keys are required. 
    features={ 
     'target': tf.FixedLenFeature([], tf.int64), 
     'context': tf.FixedLenFeature([], tf.int64), 
     'label': tf.FixedLenFeature([], tf.int64), 
    }) 

target = features['target'] 
context = features['context'] 
label = features['label'] 
min_after_dequeue = 10000 
capacity = min_after_dequeue + 3 * self._batch_size 

# Pass `enqueue_many=True` because the input is now a batch of parsed examples. 
target_batch, context_batch, label_batch = tf.train.shuffle_batch(
    [target, context, label], batch_size=self._batch_size, capacity=capacity, 
    min_after_dequeue=min_after_dequeue, num_threads=self._concurrent_steps, 
    enqueue_many=True)