2016-02-26 42 views
5

我的理解是,爲每個紀元洗牌訓練樣本是一個很好的做法,這樣每個小批量包含整個數據集的一個很好的隨機樣本。如果我將整個數據集轉換爲包含TFRecords的單個文件,那麼在加載整個數據集之後如何實現這種混洗?我的理解是,沒有有效的隨機訪問TFRecord文件。所以,具體而言,我正在尋找如何在這種情況下使用TFRecord文件的指導。TF記錄和記錄洗牌

+0

有'shuffle_batch'使用'RandomShuffleQueue'。它洗牌緩衝部分的數據集,這個問題有更多的細節 - http://stackoverflow.com/questions/33715728/using-queues-to-uniformly-sample-from-multiple-input-files –

+0

這是一個有益的但是他提出的解決方案仍然會加載整個數據集:看起來問題的關鍵在於確保這些類在小批量中被同等地表示。如果加載整個數據集不太實際,那麼看起來最好的方法就是維護文件名隊列並加載單個實例(可能有多個線程進入隊列)。在這種情況下,TFRecord似乎沒有提供太多的價值。 – bobw

回答

3

這不是 - 您可以通過將輸入分成多個輸入數據文件,然後將它們對待as explained in this answer來改善混合。

如果您需要接近「完美」洗牌的任何內容,您需要將其讀入內存中,但實際上對於大多數情況,您可能會通過分成100或1000個文件進行「足夠好」的洗牌,然後使用一個大小足以容納8-16個文件數據的shuffle隊列。

我有一個癢在腦後,寫一個外部隨機洗牌隊列,可以泄漏到磁盤,但它是我的優先級列表非常低 - 如果有人想貢獻一個,我志願審查它。 :)

+6

癢怎麼樣? +1 – TimZaman

0

其實現在你不必擔心在保存到TFRecords之前洗牌。這是因爲(當前)推薦的讀取TFRecords的方法使用tf.data.TFRecordDataset,其實施.shuffle()方法。

+0

其實,我不確定這是否屬實。您所描述的shuffle()方法只給出本地隨機性(跨越隊列的容量),而不是整個記錄。 – ezfn

+0

我從來沒有說過它使用整個數據集。但是這並不意味着基於隊列的混洗不足以提供必要的隨機性。我看到它在很少的實現中被使用,你可以看看例如tensor2tensor回購在這個方法正在使用。 – bartgras