我已经看过很多关于在张量流中使用LSTM进行时间序列的指南,但我仍然不确定目前在读取和处理数据方面的最佳实践 - 特别是当人们应该使用tf.data.Dataset
API。
在我的情况下,我有一个文件data.csv
和我的features
,并希望执行以下两项任务:
计算目标 - 时间t
的目标是变化的百分比
某些视野中的某些专栏,即
labels[i] = features[i + h, -1] / features[i, -1] - 1
我希望h
成为这里的参数,所以我可以尝试不同的视野。
获取滚动窗口 - 出于培训目的,我需要将我的功能滚动到长度为window
的窗口中:
train_features[i] = features[i: i + window]
我完全可以使用pandas
或numpy
来构建这些对象,所以我不会问如何实现这一目标 - 我的问题是具体的问题是这样的管道在{中应该是什么样子的{1}}。
编辑:我想我也想知道我列出的2个任务是否适合数据集api,或者我最好使用其他库来处理它们?
答案 0 :(得分:9)
首先请注意,您可以将数据集API 与 pandas或numpy数组一起使用,如tutorial中所述:
如果您的所有输入数据都适合内存,则最简单的方法是创建一个 来自他们的
Dataset
是将它们转换为tf.Tensor
个对象并使用Dataset.from_tensor_slices()
一个更有趣的问题是,您是否应该使用会话feed_dict
或Dataset
方法组织数据管道。正如评论中已经说明的那样,数据集API更有效,因为数据直接流向设备,绕过客户端。来自"Performance Guide":
使用
feed_dict
提供数据提供了高水平的数据 灵活性,在大多数情况下使用feed_dict
无法扩展 最佳。但是,在仅使用单个GPU的情况下 差异可以忽略不计。使用数据集API仍然是 强力推荐。尽量避免以下情况:# feed_dict often results in suboptimal performance when using large inputs sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
但是,正如他们所说的那样,差异可能可以忽略不计,GPU仍可以通过普通的feed_dict
输入充分利用。当训练速度不是很关键时,没有区别,使用任何你觉得舒服的管道。当速度很重要并且你有一个大的训练集时,数据集API似乎是一个更好的选择,特别是你计划分布式计算。
数据集API可以很好地处理文本数据,例如CSV文件,结帐this section of the dataset tutorial。