RNN 输入如下:(NumberOfSequences, TimeSteps, ElementsPerStep)
我假设 27 个特征是输入并与 相关ElementsPerStep
,而 1 个目标是每步具有 1 个输出的预期输出。所以我还假设您的输出是一个包含 550k 步的序列。
对数组进行整形:
由于数组中只有一个序列,并且该序列有 550k 步,因此您必须像这样重塑数组:
(1, 550000, 28)
#1 sequence
#550000 steps per sequence
#28 data elements per step
#PS: this sequence is too long, if it creates memory problems to you, maybe it will be a good idea to use a `stateful=True` RNN, but I'm explaining the non stateful method first.
现在您必须将此数组拆分为输入和目标:
X_train = thisArray[:, :, :27] #inputs
Y_train = thisArray[:, :, 27] #targets
塑造 keras 层:
当您定义 Keras 层时,它们将忽略批量大小(序列数),因此您将使用input_shape=(550000,27)
.
由于您想要的结果是具有相同长度的序列,我们将使用return_sequences=True
. (否则,您只会得到一个结果)。
LSTM(numberOfCells, input_shape=(550000,27), return_sequences=True)
这将输出一个形状(BatchSize, 550000, numberOfCells)
您可以使用带有 1 个单元的单层来实现输出,或者您可以堆叠更多层,考虑到最后一个应该有 1 个单元以匹配输出的形状。(当然,如果你只使用循环层)
有状态=真:
当您的序列太长以至于您的记忆无法很好地处理它们时,您必须使用stateful=True
.
在这种情况下,您将不得不分成X_train
更小长度的序列*
。系统将理解每个新批次都是之前批次的续集。
然后你需要定义batch_input_shape=(BatchSize,ReducedTimeSteps,Elements)
. 在这种情况下,不应像在其他情况下那样忽略批量大小。
*
不幸的是我没有经验stateful=True
。我不确定您是否必须手动划分阵列(我猜不太可能),或者系统是否在内部自动划分阵列(更有可能)。
推拉窗案例:
在这种情况下,我经常看到人们这样划分输入数据:
从 550k 步中,得到具有 50 步的更小的数组:
X = []
for i in range(550000-49):
X.append(originalX[i:i+50]) #then take care of the 28th element
Y = #it seems you just exclude the first 49 ones from the original