在Keras中设置RNN上的输入

时间:2017-08-31 20:29:16

标签: input neural-network keras lstm rnn

所以我在Keras中设置了输入的具体问题。

据我所知,序列长度指的是您想要建模的最长序列的窗口长度,其余部分由0' s填充。

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

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

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

这只是input_size =(50,27),我是否还需要手动拆分数据集或者Keras会自动为我做这件事吗?

1 个答案:

答案 0 :(得分:2)

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