簡體   English   中英

關於 .shuffle、.batch 和 .repeat 的 Tensorflow 數據集問題

[英]Tensorflow dataset questions about .shuffle, .batch and .repeat

我有一個關於使用 tf.Dataset 使用批處理、重復和隨機播放的問題。

我不清楚如何使用重復和隨機播放。 我知道.batch將決定有多少訓練樣本將經歷隨機梯度下降,我仍然不清楚.repeat.shuffle的用途。

第一個問題

即使在此處此處查看之后,一旦tf.errors.OutOfRangeError被拋出, .repeat用於重復數據集。 因此,在我的代碼中,這是否意味着我不再需要實現:

try:
    while True:
        _ = sess.run(self.optimizer)

except tf.errors.OutOfRangeError:
        pass

因為.repeat會在數據集耗盡后自動重復數據集? 什么時候停止? 或者它永遠不會停止,一旦經過一定數量的批次(例如 1000),您就必須退出 while True 循環?

第二個問題

其次,使用.shuffle對我來說毫無意義。 .shuffle.batch()是否意味着我有 100,000 個樣本,將 1000 個隨機放入.shuffle的緩沖區中,然后用.batch()批量說其中 100 個。 根據我的理解,下一批將使用這些樣本中的 999 個,並在緩沖區中放置 1 個新樣本。 所以如果我的樣本對它們沒有順序,那么.shuffle應該一起避免嗎? 如果使用.batch ,它仍然會從緩沖區中的 999+1 中批處理 100?

第三個問題

最后,如果我使用單獨的td.dataset對象進行測試,我應該考慮.shuffle.batch()順序? 現在我使用:

sess.run(self.test_init)
try:
    while True:
        accuracy_batch = sess.run(self.accuracy)

except tf.errors.OutOfRangeError:
    pass

和:

test_data = self.test_dataset.shuffle(self.batch_size).batch(self.batch_size)

我有超過 110,000 個訓練示例可供我使用,因此 self.batch_size 將設置我想用來測試准確性的樣本數量。 所以,如果我只想測試整個測試數據集,我不會使用.batch嗎? 但是因為我用while True迭代整個數據集,它沒有區別嗎? 隨着.shuffle的使用,我注意到我的准確度發生了變化,但沒有它它們非常相似。 這讓我覺得.shuffle正在隨機化批次並且可能會重用訓練示例?

第一個問題:

這是正確的 - 如果您提供數據集,則不再需要捕獲OutOfRangeError

repeat()接受一個可選參數來表示它應該重復的次數。 這意味着repeat(10)將在整個數據集上迭代 10 次。 如果您選擇省略參數,那么它將無限重復

第二個問題

Shuffle() (如果使用)應該在batch()之前調用 - 我們想要混洗記錄而不是批次。

首先通過按順序添加記錄來填充緩沖區,然后,一旦填滿,將隨機選擇並發出一條記錄,並從原始源讀取新記錄。

如果你有類似的東西

ds.shuffle(1000).batch(100)

然后為了返回單個批次,將最后一步重復 100 次(將緩沖區保持在 1000)。 批處理是一個單獨的操作。

第三個問題

通常我們根本不打亂測試集 - 只打亂訓練集(無論如何,我們使用整個測試集進行評估,對吧?那么為什么要打亂呢?)。

所以,如果我只想測試整個測試數據集,我不會使用.batch

嗯 - 並非如此(至少並非總是如此)。 如果您的整個測試數據集不適合內存,您當然需要使用批處理 - 這是一種常見的情況。 您可能想要測試整個數據集,但要以可管理的方式運行數字!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM