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
与 张量 一起运行的事实意味着,要获得对数据的任何特定统计信息,例如 min
或 max
,需要完整的 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 规范化输入值的范围的主要内容,如果未能解决你的问题,请参考以下文章
如果给定的数据在使用 R 或 Python 的范围(-1 到 1)内,如何以 (-3 ,-2,-1,0,1,2,3) 格式规范化数据?