2016-09-14 126 views
1

批處理看起來比feed_dicts更清潔,所以我想了解Tensorflow中的批處理。Tensorflow批處理參數

下面的代碼塊是否會在批處理中創建32個相同的圖像,然後將其送入隊列?

# Creates batches of 32 images and 32 labels. 
image_batch, label_batch = tf.train.shuffle_batch(
     [single_image, single_label], 
     batch_size=32, 
     num_threads=4, 
     capacity=50000, 
     min_after_dequeue=10000) 

一點上下文:我目前有一個文件包含大約5萬行。我使用tf.train.string_input_producertf.decode_csv來讀取CSV行,但很困惑,如何提供給tf.train.shuffle_batch作爲參數,各行或包含從文件讀取的所有行的張量。

回答

1

在您的問題的代碼片段中,張量single_imagesingle_label對應於一個圖像及其相關標籤。從tf.train.shuffle_batch(),image_batch和返回的張量對應於32個可能* - 不同圖像打包在一起,以及32個相關標籤。 TensorFlow在內部使用tf.RandomShuffleQueue來洗牌數據,並創建其他線程來評估single_imagesingle_label,以便將它們添加到此隊列中。

tf.train.shuffle_batch()函數根據傳遞的參數不同的行爲。例如,如果您通過enqueue_many=True,則參數tensors中的張量將被解釋爲批次元素,並且TensorFlow將在前導維上加入它們(因此每個張量在第0維中必須具有相同的大小)。使用enqueue_many=True您可以將整個數據集傳遞給tf.train.shuffle_batch(),或者可以傳遞批量元素(例如使用tf.ReaderBase.read_up_to())。


  *我說:「可能,不同的」,因爲你正在使用的批號等功能洗牌版本,如果你的數據集相比capacitymin_after_dequeue參數小,很可能你會看到單個批次中同一個示例的多個副本。

+0

感謝您的回覆;我仍然對'tf.train.shuffle_batch()'從哪裏繪製32個不同的圖像感到困惑。在原始文章的代碼片段中,根據提供給'tf.train.shuffle_batch()'的參數判斷,我沒有看到它能夠訪問'single_image'之外的數據。 – Eweler

+1

會發生什麼事是,TensorFlow評估'single_image'和'single_label'多次(在一個單獨的線程,通過'tf.train.start_queue_runners()'創建),並增加了這些來這裏面'tf.train.shuffle_batch創建隊列( )'。因此,如果'single_image'和'single_label'在每次評估時都有不同的值(例如,因爲它們是'ReaderBase.read()'op)的結果),那麼結果中會得到不同的圖像。如果'single_image'總是評估爲相同的值(例如,因爲它是一個常量),那麼您將獲得同一圖像的32份副本。 – mrry