在 Keras 中设置 RNN 的输入

Setting up the input on an RNN in Keras

所以我有一个关于在 Keras 中设置输入的具体问题。

我了解到序列长度是指您要建模的最长序列的 window 长度,其余部分用 0 填充。

但是,如何设置时间序列数组中已有的内容?

例如,现在我有一个 550k x 28 的数组。所以有 550k 行,每行有 28 列(27 个特征和 1 个目标)。我是否必须手动将数组拆分为(550k 序列长度)不同的数组并将所有这些数组提供给网络?

假设我希望第一层等于每行的特征数,并查看过去的 50 行,我如何调整输入层的大小?

是否只是 input_size = (50,27),我是否必须手动拆分数据集,或者 Keras 会自动为我拆分数据集?

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 分成更小的长度序列 *。系统会理解每个新批次都是先前批次的 sequel。

然后你需要定义batch_input_shape=(BatchSize,ReducedTimeSteps,Elements)。在这种情况下,不应像其他情况那样忽略批量大小。

* 不幸的是我没有使用 stateful=True 的经验。我不确定您是否必须手动划分数组(我猜不太可能),或者系统是否会自动在内部划分它(更有可能)。


滑动window案例:

在这种情况下,我经常看到的是人们这样划分输入数据:

从 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