![](/img/trans.png)
[英]Is there a way of knowing if `.repeat`/`.batch`/`.shuffle` have been used on a tensorflow dataset?
[英]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.