DataSet 规范化输入值的范围

Posted

技术标签:

【中文标题】DataSet 规范化输入值的范围【英文标题】:DataSet normalize range of input values 【发布时间】:2018-04-23 12:38:06 【问题描述】:

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

一般来说,从外界取数值时,需要对取值范围进行归一化处理;如果您插入长度、质量、速度、日期或时间等原始数字,则产生的问题将是病态的;有必要检查值的动态范围并归一化为(0,1)(-1,1) 的范围。

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

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

【问题讨论】:

您是要在整个数据集还是在每个元素内进行标准化?在每个元素内部使用 dataset.map 应该很容易,但除非您事先知道值可以采用的最大值和最小值,否则我想不出一种简单的方法来跨整个数据集执行此操作。 @Sunreef 对,就是这样,它必须跨越整个数据集,因为在查看所有实际出现的值之前,没有办法知道该怎么做。 @nwallace 使用 Tensorflow 延迟加载,我不确定您是否可以访问所有值,除非您添加一个预处理步骤,其中您只迭代整个数据集,提取最大值和最小值,然后训练时在第二步中使用此信息。但是你最好只使用普通的 Numpy 来获取这些值。 @nwallace 我猜你可以实现类似滚动最大值的东西,在其中你更新你的最大值与每批馈送到网络。您的第一个 epoch 一开始可能是错误的,因为小值会被高估,但如果您计划训练 10 个或更多 epoch,错误会自行纠正。 【参考方案1】:

我对 tensorflow 数据集主要思想的理解告诉我,复杂的预处理并不直接适用,因为 tf.data.Dataset 专门设计用于非常大量的数据,更准确地说是张量:

Dataset 可用于将输入管道表示为集合 元素(张量的嵌套结构)和“逻辑计划” 作用于这些元素的转换。

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

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

...旨在快速提供下一批,无论数据集的大小如何,如果dataset 负责预处理,它将停止世界直到第一批准备好。这就是为什么“逻辑计划”只包括本地转换,以确保数据可以流式传输,此外还允许进行转换in parallel。

这并不意味着用tf.data.Dataset 实现标准化是不可能的,我觉得它从来没有被设计成这样做,因此它看起来很丑(尽管我不能完全确定这一点)。但是,请注意batch-normalization 非常适合这张照片,这是我看到的“不错”选项之一。另一种选择是在 numpy 中进行简单的预处理并将结果输入tf.data.Dataset.from_tensor_slices。这不会使管道变得更加复杂,但完全不会限制您使用 tf.data.Dataset

【讨论】:

以上是关于DataSet 规范化输入值的范围的主要内容,如果未能解决你的问题,请参考以下文章

您如何规范化数据以输入超出训练数据范围的神经网络?

MySQL数据库设计规范

如果给定的数据在使用 R 或 Python 的范围(-1 到 1)内,如何以 (-3 ,-2,-1,0,1,2,3) 格式规范化数据?

java规范总结

如何将向量规范化/非规范化到范围 [-1;1]

编程规范