是否可以制作具有 4 维数据形状的 LSTM 模型?
Posted
技术标签:
【中文标题】是否可以制作具有 4 维数据形状的 LSTM 模型?【英文标题】:Is it possible to making LSTM model with 4 dimension shape of data? 【发布时间】:2019-07-11 14:48:28 【问题描述】:你好,巫师。 我有时间序列数据,包括几天。 我试图预测明天的成绩,范围从 0 到 100。 我假设这个成绩取决于 3 个时间序列独立特征。 每一天都是一个单位,有一个等级,但每个单位(天)有不同长度的时间序列数据。 因为每天都有很多数据长度,所以我每天滚动窗口,大小为 1080,步幅为 180。 所以我尝试将其转换为(# of unit(sample)、# of window、windowsize、features)。 最后我得到 (450, # window(not fixed), 1080, 3)。 450天,每天都有相同的长度窗口(1080)和特征(3),但窗口数不同。 我考虑过零填充,但我听说我可以使用具有不同输入长度的动态(?)LSTM。
问题是 Keras LSTM 的输入形状必须是 3 维。 所以我很困惑如何让这个形状适应 LSTM 模型。 我的目标是,当我将新的一天(形状为 (# of window, 1080, 3))放入 LSTM 模型时,我希望它能够预测成绩。
您能给我一些建议或意见吗? 谢谢你。
【问题讨论】:
【参考方案1】:很遗憾,您的问题的答案是否定的。
Keras 中 LSTM 层的输入形状必须为(batch_size, timesteps, features)
。没有第四维是可能的。
但是,由于您似乎遵循滑动窗口方法,我可以告诉您,通常的方法是在批处理维度中使用 (# of windows)。在您的情况下,这意味着您的输入形状将变为 (450 * #window, 1080, 3)
。
那么,对于预测,您只能使用一天中的最后一个窗口,而不能使用一整天。
请注意,这通常是滑动窗口方法的一大限制。如果一个好的预测需要一整天的数据而不是当天的一个窗口,那么这种方法就不会奏效。
您仍然可以尝试使用不同的窗口大小。如果不行,我建议你放弃这种做法,直接使用一天的数据,而不是先分窗。因此,(450, #(data of a day), 3)
将是您的输入形状。您所听到的是正确的:您可以在 timestep
轴上具有可变长度。为此,您必须在第一层声明input_shape=(None, 3)
。
唯一的缺点是您不能将所有数据放在一个 numpy 数组中,因为 numpy 不适用于不同的大小。换句话说,您将需要 450 个形状为 (1, #(data of a day), 3)
的 numpy 数组,而不是一个形状为 (450, #(data of a day), 3)
的 numpy 数组,其中 #(data of a day)
每次都可以不同。不幸的是,model.fit()
不能用于此,因为它希望训练数据是一个单一的 numpy 数组。相反,您可以使用 model.fit_generator
并传递给它一个生成器,该生成器在每次调用时生成这 450 个小数组中的一个。查看docs 以获取有关如何使用它的示例。请注意,由于batch_size=1
,您的训练可能会减慢。
如果这是一个问题,Keras 中的 LSTM 层支持屏蔽。为此,只需使用Masking
层作为模型中的第一个层并声明一个值(通常为0.0
,但可以是任何数字)被屏蔽。然后,您可以创建形状为(batch_size, #max_day_data, 3)
的输入张量,其中所有小于#max_day_data
数据的日期必须用将被屏蔽的值进行右填充。
为了进一步阅读,我强烈推荐在 LSTM 上使用 this answer。也许这会激发你尝试不同的方法。尤其是使用stateful
可能是一种选择,以防您一天有太多数据不适合您的记忆。
【讨论】:
感谢您的回答。它真的很有帮助。 :) 嗯.. 我尝试使用您建议的形状实现 LSTM 模型。但它会发生形状错误。由于长度不同,输入形状像(450,1)。如何获得像 (450, # timestep, 3) 这样的形状?我认为有两种方法可以改变第一层中的输入形状(声明为(None,3))或改变 np.array 形状(=(450,))。有什么解决办法??? @DosanHwang 那么你现在到底在尝试什么?我假设您正在尝试batch_size=1
方法?我忘了提到model.fit
不能解决这个问题,所以我更新了我的答案。请看看这是否能解决您的问题。以上是关于是否可以制作具有 4 维数据形状的 LSTM 模型?的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:检查目标时出错:预期(keras 序列模型层)具有 n 维,但得到的数组具有形状