我尝试为时间序列分析构建一个简单的NN。到目前为止,我仅添加了密集层(但如果您愿意,欢迎对LSTM等发表评论)。
我的输入采用常规格式{样本,时间步长,特征},例如{1000、100、3},我想要单步输出。到目前为止,我仍无法理解是否应该整理数据以及在何处。
如果我不展平,如果在最后一层之前执行,并且如果在第一层之前执行,则结果会更改。但是我还没有办法告诉你这些是否正确。
在this question下可以找到很好的讨论。但是,请注意,我对时间序列特别感兴趣。因此,我想知道在第一层之前进行展平是否会以某种方式删除依赖于时间的信息...
答案 0 :(得分:1)
在您的情况下,您输入的数据格式为{?,100,3},其中?代表批次大小。假设您在输入上应用了密集层,则该层将仅在最后一个维度(即要素上)上运行。因此,这只会获取有关您的功能的信息,而不会获取有关时间序列本身的信息。
为了包括时间序列信息,您必须先应用展平。
但是,没有正确的方法来实现您想要的目标。您可以尝试首先应用具有1个节点的密集层,这将导致形状为(?,100,1)。之后,展平并得到(?,100)的形状。最后,您使用另一个致密层,或多个致密层来获得所需的输出形状。
但是由于您要处理的输入数据具有固定的持续时间,即始终具有相同的时间步数,因此应该使用卷积神经网络(CNN)。它将保留您输入数据的2D信息,并将学习识别数据中的某些模式。您可以将其与池化层结合使用,以使网络速度更快并获得一定的翻译不变性。
否则,如果您还想处理顺序输入数据,那么您确实应该看看递归神经网络(RNN)。
答案 1 :(得分:1)
由于您的数据是临时数据,因此我建议使用专门用于处理临时数据的模型。如您所述,LSTM很受欢迎,但是Keras也有GRU的实现,您也可以尝试使用简单的因果卷积的Temporal Convolution Networks (TCNs)并避免使用LSTM和GRU的复杂内存/门控结构并且已证明在this paper的某些问题上更有效。
由于要获取输入序列并预测下一个时间步长,因此您将寻找多对一的时间结构。请参阅this post,以获取有关使用LSTM实现该功能的帮助。一个关键的要点是,return_sequences
的Keras时态模型存在一个争论,应该将其设置为False
。时态模型为您处理时间维度,对于LSTM,时态模型通过维护内部存储器来捕获时态依赖性。 TCN通过执行一维卷积来实现类似的行为,但是在某种意义上说,过去的信息不能泄漏到未来。
我建议从LSTM开始,因为您会在博客上找到最多的资源以及关于使用它们的问题,然后,如果没有得到想要的结果,则可以尝试其他模型。我不建议仅使用密集层,因为它们不能正确处理时间关系,并且我也不同意@Solvalou关于2D卷积的问题,因为您混合了时间和空间维度,这很可能会使您的网络混乱。如果进行卷积,则TCN的因果一维卷积应能为您提供所需的内容。