我试图为时间序列分析构建一个简单的神经网络。到目前为止,我只添加了致密层(但如果您喜欢,欢迎对LSTM等进行评论)。
我的输入是通常的格式{样本,时间步,特征},比如说{1000,100,3},我想要一个单步输出。到目前为止,我无法理解是否应该将数据展平,以及在哪里。
如果我不展平,如果我在最后一层之前展平,如果我在第一层之前展平,结果就会改变。但我还没有办法判断其中是否有一个是正确的。
在这个问题下可以找到一个很好的讨论。但是,请注意,我对时间序列特别感兴趣。所以,我想知道在第一层之前展平是否会以某种方式删除时间依赖所需的信息...
在您的例子中,您有{?,100,3}形状的输入数据,其中?代表批次大小。假设您在输入上应用密集层,它将仅对最后一个维度进行操作,即对您的特征进行操作。因此,这将仅获取有关您的特征的信息,而不是有关时间序列本身的信息。
为了包含时间序列信息,您必须先应用flatten。
但是,没有一个正确的方法来实现你想要做的事情。您可以尝试首先应用一个具有1个节点的密集层,这将导致形状为(?,100,1)。然后,将其展平,得到(?,100)的形状。最后,使用另一个或多个致密层来获得所需的输出形状。
但是,由于您处理的输入数据具有固定的持续时间,即始终相同的时间步数,因此您应该使用卷积神经网络(CNN)。它将保留输入数据的2D信息,并将学习识别数据中的某些模式。您可以将其与池层相结合,以加快网络速度并获得一些平移不变性。
否则,如果您还想处理顺序输入数据,您真的应该看看递归神经网络(RNN)。
由于您的数据是时态的,我建议使用专门用于处理时态数据的模型。正如您所提到的,LSTM非常流行,但Keras也有GRU的实现,您也可以尝试使用简单因果卷积的时间卷积网络(TCN),避免LSTM和GRU的复杂内存/选通结构,并且在本文的一些问题上显示出更为有效。
您将寻找多对一的时间结构,因为您正在获取输入序列并预测下一个时间步长。请参阅这篇文章以获取有关使用LSTM实现它的帮助。一个关键的收获是return_sequences
的Keras时间模型有一个参数,对您来说应该设置为False
。时间模型为您处理时间维度,并且在LSTM的情况下,通过维护内部内存来捕获时间依赖关系。TCN通过执行一维卷积来实现类似的行为,但因果关系是过去的信息不能泄露到未来。
我建议从LSTM开始,因为你会在博客上找到最多的资源,以及关于使用它们的问题,然后如果你没有得到想要的结果,你可以尝试其他模型。我不建议只使用密集层,因为它们不会正确处理时间关系,我也不同意@Solvalou关于2D卷积的观点,因为你在混合时间和空间维度,这很可能会混淆你的网络。如果你做卷积,TCN的因果1-D卷积应该给你你想要的。
我正在试图理解Keras中扁平化功能的作用。下面是我的代码,这是一个简单的两层网络。它接收形状(3,2)的二维数据,输出形状(1,4)的一维数据: 这将打印出y具有形状(1,4)。但是,如果我删除展平线,则它会打印出y具有形状(1、3、4)。 我不明白这一点。根据我对神经网络的理解,这个模型。add(Dense(16,input\u shape=(3,2)))函数正在创建一个具有16个节点的隐藏完
我正在使用TensorFlow后端。 我正在按顺序应用卷积、最大池、展平和密集层。卷积需要3D输入(高度、宽度、color\u channels\u深度)。 在卷积之后,它变为(高度、宽度、过滤器的数量)。 在应用最大池化高度和宽度变化之后。但是,在应用展平层之后,到底会发生什么?例如,如果展平之前的输入是(24, 24, 32),那么它是如何展平的? 对于每个过滤器号的高度、重量,它是像(24*
问题内容: PHP手册建议检查返回值并在屏幕上显示错误消息。 同样,对于OOP样式的构造函数,建议这样做: Stack Overflow上的一些用户甚至使用了如下代码: 但是,在过去的几周里,我一直在问自己一个问题,为什么我需要这样做?第一个示例的输出是: 警告:mysqli_connect():(HY000 / 1045):在第4行的C:\ xampp \ … \ mysqli.php中,用户’
mysqli_connect()的PHP手册建议检查返回值并在屏幕上显示错误消息。 类似地,对于OOP样式的构造函数,建议这样做: 堆栈溢出上的一些用户甚至使用带有的代码,例如: 然而,在过去的几周里,我一直在问自己一个问题,为什么我需要这样做?第一个示例的输出为: 警告:mysqli_connect():(HY000/1045):在第4行的C:\xampp\…\mysqli.php中,用户“my
问题内容: 我知道该ValueEventListener线程在新线程中运行,是否应该在任何时间删除此线程以进行适当的线程管理?(例如,没有太多并行运行的线程)。如果是,该怎么办? 问题答案: 在谈论监听器时,是的,您需要根据活动的生命周期将其删除,为此,您需要使用以下代码行: 请记住,如果不这样做,最终将浪费您的电池和带宽。所以: 如果已在中添加了侦听器,则onStart必须在中将其删除onSto
这是在创建持久订阅的上下文中。 DefaultMessageListenerContainer中有一个setClientId(),SingleConnectionFactory中有一个。 我的理解是: < li >长期订阅适用于消费者/订户。 < li >不同的消费者应该能够使用不同的客户端id。 < li >不同的消费者应该能够共享一个连接。 < li >每个使用者有一个(ListenerCon