DataSet 归一化输入值的范围

DataSet normalize range of input values

我正在 运行使用 TensorFlow 中的神经网络进行一些实验。最新版本的发行说明说 DataSet 是今后推荐的 API 来提供输入数据。

一般情况下,从外界取数值时,需要对取值范围进行归一化处理;如果你插入原始数字,如长度、质量、速度、日期或时间,结果问题将是病态的;有必要检查值的动态范围并归一化到范围 (0,1)(-1,1).

这当然可以在原始 Python 中完成。但是,DataSet 提供了许多数据转换功能并鼓励使用它们,理论上生成的代码不仅更易于维护,而且 运行 速度更快。这表明还应该有一个内置的规范化功能。

但是,查看 https://www.tensorflow.org/programmers_guide/datasets 上的文档,我没有看到任何此类提及。我错过了什么吗?推荐的方法是什么?

我对tensorflow datasets main idea的理解告诉我,复杂的预处理不能直接适用,因为tf.data.Dataset是专门设计用来stream非常大量的数据,更准确地说是张量:

A Dataset can be used to represent an input pipeline as a collection of elements (nested structures of tensors) and a "logical plan" of transformations that act on those elements.

tf.data.Dataset 使用 张量 进行运算意味着获取数据的任何特定统计信息,例如 minmax,需要一个完整的 tf.Session 和至少一个 运行 通过整个管道。以下示例行:

iterator = dataset.make_one_shot_iterator()
batch_x, batch_y = iterator.get_next()

... 旨在快速提供下一批,无论数据集的大小如何,如果 dataset 负责预加工。这就是 "logical plan" 仅包含本地转换的原因,这确保了数据可以流式传输,此外,还允许进行转换 in parallel.

这并不意味着不可能用 tf.data.Dataset 实现规范化,我觉得它从来没有被设计成这样做,因此它看起来会很难看(虽然我不能绝对确定)。但是,请注意 batch-normalization 非常适合这张图片,它是我看到的 "nice" 选项之一。另一种选择是在 numpy 中进行简单的预处理并将其结果提供给 tf.data.Dataset.from_tensor_slices。这不会使管道变得更加复杂,但根本不会限制您使用 tf.data.Dataset