Keras LSTM 输入形状 - 批量大小和时间步长

数据挖掘 机器学习 喀拉斯 张量流 lstm rnn
2022-02-14 16:03:52

所以我有82 组不同的数据,每组都有不同的长度,每个点都有一个特征和一个标签(0 或 1)。

我正在尝试使用 Keras LSTM 来预测一个点的类别,具体取决于它之前的先前值。

目前,我已将每组填充为相同的长度,并计划使用遮罩层。

在阅读了许多示例后,我感到困惑的是我应该如何重塑我的数据并为模型提供正确的输入形状。

如果每组的长度为 55,并且我想考虑前 5 个(只是扔一个数字)点来预测每一步的类,我会怎么做?

我是否应该手动使用移动窗口将每个集合分成长度为 5 的数组,然后input_shape=(5, 11, 1) 从 55/5 = 11 开始?

这是最好的方法吗?这对剩下的 80 多套如何工作?

只是为了澄清一下:假设 82 个集合中的一个看起来像这样[1.1, 4.8, ... 2.1] (length of 55),我希望模型能够预测[0, 1, ... 1] (x55)除填充点 (-1) 之外的每个点的类别。

1个回答

我认为用 LSTM 做滑动窗口没有多大意义。该层的整个想法是捕获长期依赖关系,而您只是将其与 5 步窗口限制一起丢弃。


对于这种情况,最简单的方法是使用Conv1Dwith kernel_size=5然后windows会随着内核大小自动运行。(但只有一层,如果添加更多,您将捕获更多步骤)。其他可能性是内核大小 = 3 的 2 层,或者大小为 3、2、2 的 3 层。


如果您确实想将 Windows 与 LSTM 一起使用,则必须手动组织数据。这意味着您将循环数据并获取长度为 5 的段,并将每个段视为一个单独的序列。

在这种情况下,您的输入形状将是(5,1)并且您将拥有超过 82 个样本。另一方面,如果您的所有集合都长于长度 5,则根本不需要填充。

示例循环:

originalData = load_a_list_of_samples()
windowData = []
for sample in originalData:
    L = len(sample) #number of time steps
    for segment in range(L - 5 + 1):
        windowData.append(sample[segment:segment+5])

windowData = np.array(windowData)

不过,我的建议是,除非您出于某种特殊原因有此要求,否则根本不要使用 Windows。让 LSTM 完成他们的工作并捕获长期依赖关系。

按预期填充数据,使用Masking图层并将 LSTM 与return_sequences=True.

结果将像(仅显示长度尺寸)

inputs = [step1 , step2 , step3 , step4 , step5 , step6 , step7 ]     
outpus = [class1, class2, class3, class4, class5, class6, class7]

确保你也屏蔽了你的损失函数,因为我不确定 Keras 会在那里正确地完成屏蔽工作。