0

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

我知道序列长度是指您要建模的最长序列的窗口长度,其余序列用 0 填充。

但是,如何设置已经在时间序列数组中的东西?

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

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

那只是 input_size = (50,27),我是否必须再次手动拆分数据集,还是 Keras 会自动为我做这件事?

4

1 回答 1

3

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
于 2017-08-31T21:11:19.750 回答