当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。