是否可以用4维形状的数据制作LSTM模型?

时间:2019-02-18 08:57:42

标签: lstm recurrent-neural-network

向导,向导。
我有时间序列数据,包括世俗的日子。 我尝试预测明天的等级,范围是0到100。
并且我认为这个等级取决于3个与时间序列无关的特征。

每一天都是一个单位并有一个等级,但是每个单位(天)具有不同长度的时间序列数据。
因为每天都有很多数据长度,所以我每天滚动窗口,大小为1080,步幅为180。

因此,我尝试将其转换为(单位(样本)数,窗口数,窗口大小,功能)。
终于得到(450,#window(not fixed),1080,3)。

450天,每天具有相同长度的窗口(1080)和功能(3),但是窗口数不同。
我本来是零填充的,但听说可以使用输入长度不同的dynamic(?)LSTM。

问题在于Keras LSTM的输入形状必须为3维。
所以我很困惑如何使这种形状适合LSTM模型。
我的目标是,当我在LSTM模型中放一个新的形状(窗口号,1080、3)的形状时,我希望它可以预测等级。

您能给我任何建议吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,您的问题的答案是没有。 Keras中LSTM层的输入形状必须为(batch_size, timesteps, features)。没有第四维。

但是,就像您似乎在使用滑动窗口方法一样,我可以告诉您,通常的方法是在批处理维度中包含(窗口数)。在您的情况下,这意味着您的输入形状将变为(450 * #window, 1080, 3)

然后,为了进行预测,您只需要使用一天的最后一个窗口,就不能使用一整天。

请注意,这通常是滑动窗口方法的一个巨大限制。如果一个好的预测需要一整天的数据,而不是当天的一个窗口,那么这种方法就行不通了。

您仍然可以尝试使用不同的窗口大小进行播放。如果不起作用,我建议您放弃这种方法,直接使用一天的数据,而不要先将其划分为多个窗口。因此,(450, #(data of a day), 3)将成为您的输入形状。您所听到的是正确的:timestep轴上的长度可以变化。为此,您必须在第一层声明input_shape=(None, 3)

唯一的缺点是您不能将所有数据作为一个numpy数组放在一起,因为numpy不能使用不同的大小。换句话说,您需要450个形状为(450, #(data of a day), 3)的numpy数组,而不是一个形状为(1, #(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