tf.data.Dataset.map()和tf.data.Dataset.apply()之间的区别

问题描述 投票:12回答:3

随着最近升级到1.4版,Tensorflow在库核心中包含了tf.dataversion 1.4 release notes中描述的一个“主要新特征”是tf.data.Dataset.apply(),这是一种“应用自定义转换函数的方法”。这与现有的tf.data.Dataset.map()有什么不同?

python tensorflow tensorflow-datasets
3个回答
18
投票

区别在于map将分别对Dataset的每个元素执行一个函数,而apply将立即对整个Dataset执行一个函数(例如文档中给出的group_by_window)。

apply的参数是一个接受一个元素并返回一个变换元素的函数时,Dataset的参数是一个接受Dataset并返回map的函数。


12
投票

Sunreef's answer绝对正确。你可能仍然想知道我们为什么介绍Dataset.apply(),我想我会提供一些背景知识。

tf.data API具有一组核心转换,如Dataset.map()Dataset.filter(),它们通常适用于各种数据集,不太可能发生变化,并作为tf.data.Dataset对象上的方法实现。特别是,它们与TensorFlow中的其他核心API具有相同的backwards compatibility guarantees

但是,核心方法有点限制。我们还希望在将新转换添加到核心之前自由地尝试新的转换,并允许其他库开发人员创建自己的可重用转换。因此,在TensorFlow 1.4中,我们拆分了一组生成在tf.contrib.data中的自定义转换。自定义转换包括一些具有非常特定功能(如tf.contrib.data.sloppy_interleave()),以及一些API仍处于不稳定状态(如tf.contrib.data.group_by_window())。最初我们将这些自定义转换实现为从DatasetDataset的函数,这对函数管道的语法流程产生了不幸的影响。例如:

dataset = tf.data.TFRecordDataset(...).map(...)

# Method chaining breaks when we apply a custom transformation.
dataset = custom_transformation(dataset, x, y, z)

dataset = dataset.shuffle(...).repeat(...).batch(...)

由于这似乎是一种常见的模式,我们添加了Dataset.apply()作为在单个管道中链接核心和自定义转换的方法:

dataset = (tf.data.TFRecordDataset(...)
           .map(...)
           .apply(custom_transformation(x, y, z))
           .shuffle(...)
           .repeat(...)
           .batch(...))

这是宏观方案中的一个小功能,但希望它有助于使tf.data程序更容易阅读,并且库更容易扩展。


2
投票

我没有足够的声誉来发表评论,但我只是想指出,你可以实际使用地图来应用数据集中的多个元素,这与@ sunreef对自己帖子的评论相反。

根据文档,map用作参数

map_func:将张量的嵌套结构(具有由self.output_shapes和self.output_types定义的形状和类型)映射到张量的另一个嵌套结构的函数。

output_shapes由数据集定义,可以使用批处理等api函数进行修改。因此,例如,您可以仅使用dataset.batch和.map执行批量规范化:

dataset = dataset ...
dataset.batch(batch_size)
dataset.map(normalize_fn)

似乎apply()的主要用途是当你真的想要在整个数据集中进行转换时。

© www.soinside.com 2019 - 2024. All rights reserved.