LSTM:如何有效地理解和使用return_sequences=False?



我正在执行多变量时间序列分析。我打算使用不同的批量大小和超参数多次运行此网络。因此,到目前为止,我一直保持一般情况并假设

B := Number of batches
T := Number of timesteps per batch
N := Number of features per timestep 

我的最终目标是在一个批次上调用 model.predict(当然,这还没有用于训练(。因此它看起来像这样

prediction = model.predict(unknown)
unknown.shape = (T, N)
prediction.shape = (N,)

我一直在尝试大量的网络。

我无法让它工作

model.add(LSTM(N, input_shape=(T, N), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(N, input_shape=(T, N), return_sequences=False)) 
model.add(Dense(N))

但是,我可以让它工作

model.add(LSTM(N, input_shape=(T, N), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(N, input_shape=(T, N), return_sequences=True)) # True here 
model.add(Dense(N))

如果输出包含最后一个时间步长,即我正在寻找的 f(t+1(,return_sequences=True 有什么问题?我想什么都没有,但这并不能解决根本问题,即我不完全了解如何构建这些网络。就像我说的,我想在开始实验之前尽可能保持一般性并深入了解网络。

我将对 B、T 和 N 进行非常不同的值的实验,看看哪个效果最好。

我试图阅读文档之类的东西,但我非常困住并感到沮丧,所以我想我会转向社区。

希望以下代码有所帮助 例如,如果每层中的节点数为 150

model.add(LSTM(150, return_sequences=True,input_shape=(T,N)))
model.add(LSTM(150))
model.add(Dense(1))

并在代码的第二个 lstm 中删除 input_shape=(T, N(。您已指定它需要 2D 数组 (T,N(,但第一个 LSTM 提供了一个由 (1,T,N( 组成的 3D 数组

无需在第二个循环层中指定input_shape参数。当循环层是网络中的第一层时,明确需要此参数,否则则不需要。

如果您希望在每个循环层指定输入批处理形状,请记住设置参数stateful = True以使 LSTM 有状态(并且仅在网络的第一层使用此参数(。

相关内容

最新更新