29

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

4

4 回答 4

40

不同之处在于,map它将在每个元素上Dataset单独apply执行一个函数,而将一次对整个函数执行一个函数Dataset(例如group_by_window文档中给出的示例)。

of 的参数apply是一个接受 aDataset并返回 a的函数,Dataset而 of 的参数map是一个接受一个元素并返回一个转换后的元素的函数。

于 2017-11-03T12:56:35.270 回答
20

Sunreef 的回答是绝对正确的。您可能仍然想知道我们为什么要介绍Dataset.apply(),我想我会提供一些背景信息。

tf.dataAPI 有一组核心转换(如和Dataset.map()),Dataset.filter()它们通常在广泛的数据集中很有用,不太可能更改,并作为tf.data.Dataset对象上的方法实现。特别是,它们受到与TensorFlow 中其他核心 API相同的向后兼容性保证。

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

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程序更易于阅读,并使库更易于扩展。

于 2017-11-03T15:29:00.180 回答
4

我没有足够的声誉发表评论,但我只是想指出,与@sunreef 在他自己的帖子中的评论相反,您实际上可以使用 map 应用于数据集中的多个元素。

根据文档, 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()当你真的想对整个数据集进行转换时, 它的主要用途似乎是。

于 2017-11-03T21:12:46.113 回答
0

简单地说, of 的transformation_func论点apply()Dataset;的论点map_funcmap()element

于 2021-04-17T07:13:15.533 回答