當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.data.Dataset.interleave用法及代碼示例


用法

interleave(
    map_func, cycle_length=None, block_length=None, num_parallel_calls=None,
    deterministic=None, name=None
)

參數

  • map_func 一個接受數據集元素並返回 tf.data.Dataset 的函數。
  • cycle_length (可選。)將同時處理的輸入元素的數量。如果未設置,則 tf.data 運行時會根據可用的 CPU 決定它應該是什麽。如果 num_parallel_calls 設置為 tf.data.AUTOTUNE ,則 cycle_length 參數標識最大並行度。
  • block_length (可選。)在循環到另一個輸入元素之前從每個輸入元素生成的連續元素的數量。如果未設置,則默認為 1。
  • num_parallel_calls (可選。)如果指定,則實現創建一個線程池,用於從循環元素異步和並行獲取輸入。默認行為是同步地從循環元素中獲取輸入,沒有並行性。如果使用值tf.data.AUTOTUNE,則並行調用的數量根據可用的 CPU 動態設置。
  • deterministic (可選。)指定 num_parallel_calls 時,如果指定了此布爾值( TrueFalse ),它將控製轉換生成元素的順序。如果設置為 False ,則允許轉換產生無序元素,以用確定性換取性能。如果未指定,則 tf.data.Options.deterministic 選項(默認為 True)控製行為。
  • name (可選。) tf.data 操作的名稱。

返回

  • Dataset 一個Dataset

跨此數據集映射map_func,並交錯結果。

類型簽名是:

def interleave(
  self:Dataset[T],
  map_func:Callable[[T], Dataset[S]]
) -> Dataset[S]

例如,您可以使用 Dataset.interleave() 來同時處理多個輸入文件:

# Preprocess 4 files concurrently, and interleave blocks of 16 records
# from each file.
filenames = ["/var/data/file1.txt", "/var/data/file2.txt",
             "/var/data/file3.txt", "/var/data/file4.txt"]
dataset = tf.data.Dataset.from_tensor_slices(filenames)
def parse_fn(filename):
  return tf.data.Dataset.range(10)
dataset = dataset.interleave(lambda x:
    tf.data.TextLineDataset(x).map(parse_fn, num_parallel_calls=1),
    cycle_length=4, block_length=16)

cycle_lengthblock_length 參數控製生成元素的順序。 cycle_length 控製同時處理的輸入元素的數量。如果將 cycle_length 設置為 1,則此轉換將一次處理一個輸入元素,並將產生與 tf.data.Dataset.flat_map 相同的結果。通常,此轉換會將map_func 應用於cycle_length 輸入元素,在返回的Dataset 對象上打開迭代器,並在它們之間循環,從每個迭代器生成block_length 連續元素,並在每次執行時消耗下一個輸入元素到達迭代器的末尾。

例如:

dataset = Dataset.range(1, 6)  # ==> [ 1, 2, 3, 4, 5 ]
# NOTE:New lines indicate "block" boundaries.
dataset = dataset.interleave(
    lambda x:Dataset.from_tensors(x).repeat(6),
    cycle_length=2, block_length=4)
list(dataset.as_numpy_iterator())
[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 是純函數且 deterministic=True ,此轉換產生的元素的順序是確定的。如果map_func 包含任何有狀態操作,則訪問該狀態的順序是未定義的。

性能通常可以通過設置num_parallel_calls 來提高,這樣interleave 將使用多個線程來獲取元素。如果不需要確定性,設置 deterministic=False 也可以提高性能。

filenames = ["/var/data/file1.txt", "/var/data/file2.txt",
             "/var/data/file3.txt", "/var/data/file4.txt"]
dataset = tf.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.interleave(lambda x:tf.data.TFRecordDataset(x),
    cycle_length=4, num_parallel_calls=tf.data.AUTOTUNE,
    deterministic=False)

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.data.Dataset.interleave。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。