在 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
所以我有一个关于在 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