最近學習tensorflow
,對於這個函數tf.data.Dataset.interleave()
始終有點暈乎,即使搞明白了,用不了多久又忘了,在網上查了查,發現很少有人能把這個函數講清楚。趁着現在還明白,記錄下來——備忘+助友。
interleave()
是Dataset
的類方法,所以interleave
是作用在一個Dataset
上的。
語法:
interleave(
map_func,
cycle_length=AUTOTUNE,
block_length=1,
num_parallel_calls=None
)
解釋:
- 假定我們現在有一個Dataset——A
- 從該A中取出cycle_length個element,然後對這些element apply map_func,得到cycle_length個新的Dataset對象。
- 然後從這些新生成的Dataset對象中取數據,取數邏輯爲輪流從每個對象裏面取數據,每次取block_length個數據
- 當這些新生成的某個Dataset的對象取盡時,從原Dataset中再取cycle_length個element,,然後apply
map_func,以此類推。
舉例:
a = tf.data.Dataset.range(1, 6) # ==> [ 1, 2, 3, 4, 5 ]
# NOTE: New lines indicate "block" boundaries.
b=a.interleave(lambda x: tf.data.Dataset.from_tensors(x).repeat(6),
cycle_length=2, block_length=4)
for item in b:
print(item.numpy(),end=', ')
輸出結果:
1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5,
上面程序的圖示,看示意圖可能更清晰:
其中map_func在這裏是重複6次-repeat(6)。
常見case:
dataset裏面存儲文件名, 將所有文件讀取出來,產生一個大數據集
更詳細內容可以參考官方文檔