所以我在Keras中设置了输入的具体问题。
据我所知,序列长度指的是您想要建模的最长序列的窗口长度,其余部分由0' s填充。
但是,如何设置已存在于时间序列数组中的内容?
例如,现在我有一个550k x 28的数组。所以有550k行,每行有28列(27个特征和1个目标)。我是否必须手动将阵列分成(550k-序列长度)不同的阵列并将所有这些阵列馈送到网络?
假设我希望第一层相当于每行的特征数量,并查看过去的50行,我该如何调整输入层的大小?
这只是input_size =(50,27),我是否还需要手动拆分数据集或者Keras会自动为我做这件事吗?
答案 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