最近升级到1.4版,Tensorflow在库核心中包含了tf.data
。
version 1.4 release notes中描述的一个“主要新功能”是tf.data.Dataset.apply()
,这是一种“方法”
应用自定义转换函数“。这与现有的tf.data.Dataset.map()
有什么不同?
答案 0 :(得分:18)
区别在于map
将分别对Dataset
的每个元素执行一个函数,而apply
将同时对整个Dataset
执行一个函数(例如apply
作为文档中的示例提供group_by_window
。
Dataset
的参数是一个函数,当Dataset
的参数是一个接受一个元素并返回一个元素的函数时,它接受map
并返回CREATE TABLE
`appointments`
(
`appointment_id` INT PRIMARY KEY AUTO_INCREMENT,
`start_date` DATE,
`end_date` DATE
);
INSERT INTO
`appointments`
(`start_date`, `end_date`)
VALUES
('2017-11-01', '2017-11-02'),
('2017-11-03', '2017-11-07'),
('2017-11-20', '2017-11-28'),
('2017-11-13', '2017-12-02');
元件。
答案 1 :(得分: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()
)。最初我们将这些自定义转换实现为从Dataset
到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
程序更易于阅读,并且库更容易扩展。
答案 2 :(得分:3)
我没有足够的声誉来发表评论,但我只是想指出,您可以实际使用地图来应用数据集中的多个元素,而不是@ 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()
的主要用途似乎是您真正希望在整个数据集中进行转换。
答案 3 :(得分:0)
简单地说,transformation_func
的{{1}}的论证是apply()
; Dataset
的 map_func
的论证是 map()