Keras、顺序和时间序列:我们应该扁平化还是不扁平化?
Posted
技术标签:
【中文标题】Keras、顺序和时间序列:我们应该扁平化还是不扁平化?【英文标题】:Keras, sequential, and timeseries: should we flatten or not? 【发布时间】:2020-03-26 06:57:40 【问题描述】:我尝试为时间序列分析构建一个简单的 NN。到目前为止,我只添加了密集层(但如果这是您喜欢的,欢迎对 LSTM 等发表评论)。
我的输入采用通常的格式 samples, time steps, features,比如说 1000, 100, 3,我想要一个单步输出。到目前为止,我无法理解我是否应该展平数据,以及在哪里。
如果我不展平,如果我在最后一层之前做,如果我在第一层之前做,结果会改变。但是我还没有办法判断这些是否正确。
可以在this question 下找到很好的讨论。但是,请注意,我对 timeseries 特别感兴趣。所以,我想知道在第一层之前展平是否会以某种方式删除时间依赖性所需的信息......
【问题讨论】:
【参考方案1】:由于您的数据是时间数据,因此我建议您使用专门用于处理时间数据的模型。正如您所提到的,LSTM 非常流行,但 Keras 也实现了GRU,您也可以尝试使用简单的因果卷积并避免 LSTM 和 GRU 的复杂内存/门控结构的Temporal Convolution Networks (TCNs),并且已被证明是更有效解决this paper中的一些问题。
您将寻找多对一的时间结构,因为您正在获取输入序列并预测下一个时间步长。请参阅this post 以获取有关使用 LSTM 实现该功能的帮助。一个关键的要点是return_sequences
的 Keras 时间模型有一个参数,你应该将它设置为 False
。时间模型为您处理时间维度,并且在 LSTM 的情况下,通过维护内部存储器来捕获时间依赖性。 TCN 通过执行一维卷积实现了类似的行为,但因果关系是过去的信息不能泄漏到未来。
我建议从 LSTM 开始,因为您会在博客上找到最多的资源以及关于使用它们的 SO 问题,然后如果您没有得到想要的结果,您可以尝试其他模型。我不建议只使用密集层,因为它们不能正确处理时间关系,而且我也不同意@Solvalou 关于 2D 卷积的观点,因为您正在混合时间和空间维度,这很可能只会混淆您的网络。如果您进行卷积,TCN 的因果一维卷积应该可以满足您的需求。
【讨论】:
您能解释一下为什么您认为 2D 卷积可能会混淆网络吗?如果您进行一维卷积,则对三个特征中的每一个都独立执行卷积。但由于这些特征可能是相关的,我认为 2D 卷积可能是有意义的。这当然取决于问题。如果你想对序列数据进行预测,RNN 是更好的选择。但是用于固定持续时间输入的 CNN 可能比 RNN 表现更好。 @Helen 你到底想达到什么目的? 我同意这取决于问题(例如深度学习建议),但总的来说,我认为您的建议非常不标准。 2D 卷积对图像效果很好的原因是因为网格结构中的相邻像素之间通常存在非常高的相关性。您必须对您的特征及其时间关系有一些强大的先验知识,才能认为相同的相关性应该适用于您的时间序列数据。当然,它可能在特定数据集上运行良好,因此值得一试,但我绝对不建议将其作为起点。 @Solvalou 例如,这与股票市场分析非常相似,但我们还想找出输入变量之间是否存在相关性;如果有,理想情况下,网络也将利用这些优势。 (所以可能这两个建议都应该尝试......)感谢你们两个有用的答案!【参考方案2】:在您的情况下,您输入了 ?, 100, 3 形状的数据,其中 ?表示批量大小。假设您在输入上应用了密集层,它只会在最后一个维度上运行,即在您的特征上。因此,这只会获取有关您的功能的信息,而不是有关时间序列本身的信息。 为了包含时间序列信息,您必须先应用 flatten。
但是,没有正确的方法可以实现您想做的事情。您可以尝试首先应用具有 1 个节点的 Dense 层,这将产生 (?, 100, 1) 的形状。之后,您将其展平并获得 (?, 100) 的形状。最后,您使用另一个密集层或多个密集层来获得所需的输出形状。
但由于您处理的是具有固定持续时间的输入数据,即始终具有相同数量的时间步,因此您应该使用卷积神经网络 (CNN)。它将保留输入数据的 2D 信息,并学会识别数据中的某些模式。您可以将它与池化层结合起来,以使您的网络更快并获得一些平移不变性。
否则,如果您还想处理顺序输入数据,您真的应该看看循环神经网络 (RNN)。
【讨论】:
以上是关于Keras、顺序和时间序列:我们应该扁平化还是不扁平化?的主要内容,如果未能解决你的问题,请参考以下文章