是否可以制作具有 4 维数据形状的 LSTM 模型?
Is it possible to making LSTM model with 4 dimension shape of data?
你好,巫师。
我有时间序列数据,包括几天。
我尝试预测明天的等级,范围从 0 到 100。
我假设这个等级取决于 3 个时间序列独立特征。
每一天都是一个单元,都有一个等级,但是每个单元(天)的时间序列数据长度不同。
因为每天都有很多数据长度,所以我每天滚动window,大小为1080,步幅为180。
所以我尝试将其转换为 (# of unit(sample), # of window, windowsize, features).
最后我得到 (450, # window(not fixed), 1080, 3).
450天,每一天的长度window(1080)和特征(3)相同,但windows的数量不同。
我考虑过零填充,但我听说我可以使用具有不同输入长度的动态(?)LSTM。
问题是 Keras LSTM 的输入形状必须是 3 维的。
所以我很困惑我应该如何使这个形状适合 LSTM 模型。
我的目标是,当我将新的一天(# of window, 1080, 3)放入 LSTM 模型时,我希望它预测成绩。
你能给我什么建议或建议吗?
谢谢你。
很遗憾,您的问题的答案是否定的。
Keras 中 LSTM 层的输入形状必须为 (batch_size, timesteps, features)
。没有第四维是可能的。
但是,由于您似乎遵循滑动 window 方法,我可以告诉您通常的方法是在批次维度中包含 (# of windows)。在您的情况下,这意味着您的输入形状将变为 (450 * #window, 1080, 3)
.
然后,对于预测,您只能使用一天的最后 window,不能使用一整天。
请注意,这通常是滑动 window 方法的一个巨大限制。如果一个好的预测需要一整天的数据而不是当天的一个 window,这种方法就不会奏效。
您仍然可以尝试使用不同的 window 尺寸。如果不行,我建议你放弃这种做法,直接使用一天的数据,而不是先分成windows。因此,(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。也许这会激发您尝试不同的方法。特别是使用 stateful
可能是一种选择,以防您一天的数据太多而无法放入您的内存中。
你好,巫师。
我有时间序列数据,包括几天。
我尝试预测明天的等级,范围从 0 到 100。
我假设这个等级取决于 3 个时间序列独立特征。
每一天都是一个单元,都有一个等级,但是每个单元(天)的时间序列数据长度不同。
因为每天都有很多数据长度,所以我每天滚动window,大小为1080,步幅为180。
所以我尝试将其转换为 (# of unit(sample), # of window, windowsize, features).
最后我得到 (450, # window(not fixed), 1080, 3).
450天,每一天的长度window(1080)和特征(3)相同,但windows的数量不同。
我考虑过零填充,但我听说我可以使用具有不同输入长度的动态(?)LSTM。
问题是 Keras LSTM 的输入形状必须是 3 维的。
所以我很困惑我应该如何使这个形状适合 LSTM 模型。
我的目标是,当我将新的一天(# of window, 1080, 3)放入 LSTM 模型时,我希望它预测成绩。
你能给我什么建议或建议吗? 谢谢你。
很遗憾,您的问题的答案是否定的。
Keras 中 LSTM 层的输入形状必须为 (batch_size, timesteps, features)
。没有第四维是可能的。
但是,由于您似乎遵循滑动 window 方法,我可以告诉您通常的方法是在批次维度中包含 (# of windows)。在您的情况下,这意味着您的输入形状将变为 (450 * #window, 1080, 3)
.
然后,对于预测,您只能使用一天的最后 window,不能使用一整天。
请注意,这通常是滑动 window 方法的一个巨大限制。如果一个好的预测需要一整天的数据而不是当天的一个 window,这种方法就不会奏效。
您仍然可以尝试使用不同的 window 尺寸。如果不行,我建议你放弃这种做法,直接使用一天的数据,而不是先分成windows。因此,(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
数据的日期必须用将被屏蔽的值右填充。
为了进一步阅读,我强烈推荐 stateful
可能是一种选择,以防您一天的数据太多而无法放入您的内存中。