2024-05-14 08:26:43 发布
网友
随着最近升级到1.4版,Tensorflow在库核心中包含了tf.data。 在version 1.4 release notes中描述的一个“主要新特性”是dataset#apply" rel="noreferrer">^{},它是 应用自定义转换函数”。这与已经存在的^{}有何不同?
tf.data
Sunreef's answer绝对正确。你可能还在想,为什么我们要介绍^{},我想我会提供一些背景知识。
tf.dataAPI有一组核心转换,如Dataset.map()和Dataset.filter(),这些转换通常在广泛的数据集中很有用,不太可能更改,并作为tf.data.Dataset对象上的方法实现。特别是,它们与TensorFlow中的其他核心api受相同的backwards compatibility guarantees约束。
Dataset.map()
Dataset.filter()
tf.data.Dataset
但是,核心方法有点限制。我们还希望在将新的转换添加到核心之前能够自由地进行试验,并允许其他库开发人员创建自己的可重用转换。因此,在TensorFlow 1.4中,我们分离出了一组生活在tf.contrib.data中的自定义转换。自定义转换包括一些具有非常特定功能的转换(如^{}),以及一些API仍在不断变化的转换(如^{})。最初,我们将这些自定义转换实现为从Dataset到Dataset的函数,这对管道的语法流产生了不幸的影响。例如:
tf.contrib.data
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.apply()
dataset = (tf.data.TFRecordDataset(...) .map(...) .apply(custom_transformation(x, y, z)) .shuffle(...) .repeat(...) .batch(...))
这是总体方案中的一个小特性,但希望它有助于使tf.data程序更易于阅读,并且使库更易于扩展。
区别在于map将分别对Dataset的每个元素执行一个函数,而apply将同时对整个Dataset执行一个函数(例如文档中给出的示例^{})。
map
apply
当map的参数是接受一个元素并返回一个已转换元素的函数时,apply的参数是接受一个元素并返回一个Dataset的函数。
我没有足够的声誉发表评论,但我只想指出,实际上可以使用map应用于数据集中的多个元素,而不是@sunreef在他自己的帖子中的评论。
根据文档,map以
map_func: A function mapping a nested structure of tensors (having shapes and types defined by self.output_shapes and self.output_types) to another nested structure of tensors.
输出形状由数据集定义,可以使用批处理等api函数进行修改。因此,例如,您可以仅使用dataset.batch和.map执行批处理规范化:
dataset = dataset ... dataset.batch(batch_size) dataset.map(normalize_fn)
似乎apply()的主要实用程序是当您真正想跨整个数据集进行转换时。
apply()
Sunreef's answer绝对正确。你可能还在想,为什么我们要介绍^{} ,我想我会提供一些背景知识。
tf.data
API有一组核心转换,如Dataset.map()
和Dataset.filter()
,这些转换通常在广泛的数据集中很有用,不太可能更改,并作为tf.data.Dataset
对象上的方法实现。特别是,它们与TensorFlow中的其他核心api受相同的backwards compatibility guarantees约束。但是,核心方法有点限制。我们还希望在将新的转换添加到核心之前能够自由地进行试验,并允许其他库开发人员创建自己的可重用转换。因此,在TensorFlow 1.4中,我们分离出了一组生活在} ),以及一些API仍在不断变化的转换(如^{} )。最初,我们将这些自定义转换实现为从
tf.contrib.data
中的自定义转换。自定义转换包括一些具有非常特定功能的转换(如^{Dataset
到Dataset
的函数,这对管道的语法流产生了不幸的影响。例如:由于这似乎是一种常见的模式,我们添加了
Dataset.apply()
作为在单个管道中链接核心和自定义转换的方法:这是总体方案中的一个小特性,但希望它有助于使
tf.data
程序更易于阅读,并且使库更易于扩展。区别在于} )。
map
将分别对Dataset
的每个元素执行一个函数,而apply
将同时对整个Dataset
执行一个函数(例如文档中给出的示例^{当
map
的参数是接受一个元素并返回一个已转换元素的函数时,apply
的参数是接受一个元素并返回一个Dataset
的函数。我没有足够的声誉发表评论,但我只想指出,实际上可以使用map应用于数据集中的多个元素,而不是@sunreef在他自己的帖子中的评论。
根据文档,map以
输出形状由数据集定义,可以使用批处理等api函数进行修改。因此,例如,您可以仅使用dataset.batch和.map执行批处理规范化:
似乎
apply()
的主要实用程序是当您真正想跨整个数据集进行转换时。相关问题 更多 >
编程相关推荐