Keras 的 LSTM 层的时间步长是多少?以及如何选择此参数的值?
What is timestep in LSTM layers from Keras? and How choose the value for this parameter?
我无法理解 LSTM 层中的参数 "timestep"。我找到了一些含义,但我现在很困惑。有人提到它是在训练期间进入模型的每个批量大小的数据量。另一方面,其他人说它是 LSTM 层中一个单元格的出现次数,而状态正在从一个单元格传递到另一个单元格。
关键是我有以下形式的训练数据:
(sequences, number of frames per sequence, width, height, channel = 1)
(2000, 5, 80, 80, 1)
我的模型必须预测以下帧序列,在本例中为 5 个未来帧。该模型由一个变分自动编码器组成,首先我使用 3D 卷积层压缩 5 帧的序列,然后我调整输出的大小以便我可以进入 LSTM 层,该层只接受(批次、时间步长、特征)。
Model: "sequential"
____________________________________________________________________________________________________
Layer (type) Output Shape Param #
====================================================================================================
conv3d (Conv3D) (None, 2, 27, 27, 32) 19392
____________________________________________________________________________________________________
batch_normalization (BatchNormalization) (None, 2, 27, 27, 32) 128
____________________________________________________________________________________________________
conv3d_1 (Conv3D) (None, 1, 14, 14, 32) 2654240
____________________________________________________________________________________________________
batch_normalization_1 (BatchNormalization) (None, 1, 14, 14, 32) 128
____________________________________________________________________________________________________
conv3d_2 (Conv3D) (None, 1, 7, 7, 64) 3211328
____________________________________________________________________________________________________
batch_normalization_2 (BatchNormalization) (None, 1, 7, 7, 64) 256
____________________________________________________________________________________________________
flatten (Flatten) (None, 3136) 0
____________________________________________________________________________________________________
reshape (Reshape) (None, 4, 784) 0
____________________________________________________________________________________________________
lstm (LSTM) (None, 64) 217344
____________________________________________________________________________________________________
repeat_vector (RepeatVector) (None, 4, 64) 0
____________________________________________________________________________________________________
lstm_1 (LSTM) (None, 4, 64) 33024
____________________________________________________________________________________________________
time_distributed (TimeDistributed) (None, 4, 784) 50960
____________________________________________________________________________________________________
reshape_1 (Reshape) (None, 1, 7, 7, 64) 0
____________________________________________________________________________________________________
conv3d_transpose (Conv3DTranspose) (None, 2, 14, 14, 64) 6422592
____________________________________________________________________________________________________
batch_normalization_3 (BatchNormalization) (None, 2, 14, 14, 64) 256
____________________________________________________________________________________________________
conv3d_transpose_1 (Conv3DTranspose) (None, 4, 28, 28, 32) 5308448
____________________________________________________________________________________________________
batch_normalization_4 (BatchNormalization) (None, 4, 28, 28, 32) 128
____________________________________________________________________________________________________
conv3d_transpose_2 (Conv3DTranspose) (None, 8, 84, 84, 1) 19361
____________________________________________________________________________________________________
batch_normalization_5 (BatchNormalization) (None, 8, 84, 84, 1) 4
____________________________________________________________________________________________________
cropping3d (Cropping3D) (None, 8, 80, 80, 1) 0
____________________________________________________________________________________________________
cropping3d_1 (Cropping3D) (None, 5, 80, 80, 1) 0
====================================================================================================
我终于使用 RESHAPE 层进入 LSTM 层,形状为 (batch, 4, 784)。也就是说,我已经调用了timestpe = 4。我觉得应该是5,或者不一定应该等于我要预测的帧数。
这种情况下timestep的真正含义是什么?我需要对图层的值进行排序吗?非常感谢您的支持。
另一方面,我正在考虑对每一帧应用卷积层,不再对整个 5 帧序列应用卷积层,而是逐帧将卷积层的输出连接到 LSTM 层,最后连接每个帧的 LSTM 层的输出状态,尊重帧的顺序,在这种情况下我考虑使用 timestpe = 1.
I have called timestpe = 4. I think it should be 5, or not necessarily should be equal to the number of frames I want to predict.
你是对的。时间步长不等于您要预测的帧数。
让我们用自然语言友好的描述来构建它。
时间步长本质上是用于预测未来步长的单元数(seconds/minutes/hours/days/frames 在视频等中)。
例如,您想要预测最近 5 天的股票价格。在这种情况下,时间步长 = 5,其中 T-5 = current_day - 5,T-4 = current_day - 4 等。请注意 current_day 在这里类似于 'future day',喜欢今天的 'predicting in advance'。
您想预测当天的股票价格。在这种情况下,您将 一步预测 。但是,您可能还想预测当天、明天和后天的股票价格。也就是说,通过考虑 T-5、T-4、T-3、T-2、T-1.The 来预测 T、T+1、T+2 第二种情况的公认命名法称为 多步预测.
注意与 "past" 严格相关的时间步如何与 多步预测 的计算无关。
显然,根据你的问题,几乎总是这样,对于多步预测,你可能需要考虑更大的 "past" 框架,即增加时间步数,以便帮助您的 LSTM 捕获更多数据相关性。
如果要将其与每批数据量相关联,则可以考虑批大小为 2 等于 2 个数据块,其中 [T-5,T-4,T-3,T -2,T-1] 用于预测 T。因此,2 个块的形式 ([T-5,T-4,T-3,T-2,T-1],[T]).
当您准备数据并且想要预测下一帧时,当然您需要对过去的值(T-5、T-4...)进行精确完美的排序 在块中。你不需要的是从视频中获取精确的连续块。
换句话说,您可以拥有视频 1 中的上述块、视频 9 中的块等。
我无法理解 LSTM 层中的参数 "timestep"。我找到了一些含义,但我现在很困惑。有人提到它是在训练期间进入模型的每个批量大小的数据量。另一方面,其他人说它是 LSTM 层中一个单元格的出现次数,而状态正在从一个单元格传递到另一个单元格。
关键是我有以下形式的训练数据:
(sequences, number of frames per sequence, width, height, channel = 1)
(2000, 5, 80, 80, 1)
我的模型必须预测以下帧序列,在本例中为 5 个未来帧。该模型由一个变分自动编码器组成,首先我使用 3D 卷积层压缩 5 帧的序列,然后我调整输出的大小以便我可以进入 LSTM 层,该层只接受(批次、时间步长、特征)。
Model: "sequential"
____________________________________________________________________________________________________
Layer (type) Output Shape Param #
====================================================================================================
conv3d (Conv3D) (None, 2, 27, 27, 32) 19392
____________________________________________________________________________________________________
batch_normalization (BatchNormalization) (None, 2, 27, 27, 32) 128
____________________________________________________________________________________________________
conv3d_1 (Conv3D) (None, 1, 14, 14, 32) 2654240
____________________________________________________________________________________________________
batch_normalization_1 (BatchNormalization) (None, 1, 14, 14, 32) 128
____________________________________________________________________________________________________
conv3d_2 (Conv3D) (None, 1, 7, 7, 64) 3211328
____________________________________________________________________________________________________
batch_normalization_2 (BatchNormalization) (None, 1, 7, 7, 64) 256
____________________________________________________________________________________________________
flatten (Flatten) (None, 3136) 0
____________________________________________________________________________________________________
reshape (Reshape) (None, 4, 784) 0
____________________________________________________________________________________________________
lstm (LSTM) (None, 64) 217344
____________________________________________________________________________________________________
repeat_vector (RepeatVector) (None, 4, 64) 0
____________________________________________________________________________________________________
lstm_1 (LSTM) (None, 4, 64) 33024
____________________________________________________________________________________________________
time_distributed (TimeDistributed) (None, 4, 784) 50960
____________________________________________________________________________________________________
reshape_1 (Reshape) (None, 1, 7, 7, 64) 0
____________________________________________________________________________________________________
conv3d_transpose (Conv3DTranspose) (None, 2, 14, 14, 64) 6422592
____________________________________________________________________________________________________
batch_normalization_3 (BatchNormalization) (None, 2, 14, 14, 64) 256
____________________________________________________________________________________________________
conv3d_transpose_1 (Conv3DTranspose) (None, 4, 28, 28, 32) 5308448
____________________________________________________________________________________________________
batch_normalization_4 (BatchNormalization) (None, 4, 28, 28, 32) 128
____________________________________________________________________________________________________
conv3d_transpose_2 (Conv3DTranspose) (None, 8, 84, 84, 1) 19361
____________________________________________________________________________________________________
batch_normalization_5 (BatchNormalization) (None, 8, 84, 84, 1) 4
____________________________________________________________________________________________________
cropping3d (Cropping3D) (None, 8, 80, 80, 1) 0
____________________________________________________________________________________________________
cropping3d_1 (Cropping3D) (None, 5, 80, 80, 1) 0
====================================================================================================
我终于使用 RESHAPE 层进入 LSTM 层,形状为 (batch, 4, 784)。也就是说,我已经调用了timestpe = 4。我觉得应该是5,或者不一定应该等于我要预测的帧数。
这种情况下timestep的真正含义是什么?我需要对图层的值进行排序吗?非常感谢您的支持。
另一方面,我正在考虑对每一帧应用卷积层,不再对整个 5 帧序列应用卷积层,而是逐帧将卷积层的输出连接到 LSTM 层,最后连接每个帧的 LSTM 层的输出状态,尊重帧的顺序,在这种情况下我考虑使用 timestpe = 1.
I have called timestpe = 4. I think it should be 5, or not necessarily should be equal to the number of frames I want to predict.
你是对的。时间步长不等于您要预测的帧数。
让我们用自然语言友好的描述来构建它。
时间步长本质上是用于预测未来步长的单元数(seconds/minutes/hours/days/frames 在视频等中)。
例如,您想要预测最近 5 天的股票价格。在这种情况下,时间步长 = 5,其中 T-5 = current_day - 5,T-4 = current_day - 4 等。请注意 current_day 在这里类似于 'future day',喜欢今天的 'predicting in advance'。
您想预测当天的股票价格。在这种情况下,您将 一步预测 。但是,您可能还想预测当天、明天和后天的股票价格。也就是说,通过考虑 T-5、T-4、T-3、T-2、T-1.The 来预测 T、T+1、T+2 第二种情况的公认命名法称为 多步预测.
注意与 "past" 严格相关的时间步如何与 多步预测 的计算无关。
显然,根据你的问题,几乎总是这样,对于多步预测,你可能需要考虑更大的 "past" 框架,即增加时间步数,以便帮助您的 LSTM 捕获更多数据相关性。
如果要将其与每批数据量相关联,则可以考虑批大小为 2 等于 2 个数据块,其中 [T-5,T-4,T-3,T -2,T-1] 用于预测 T。因此,2 个块的形式 ([T-5,T-4,T-3,T-2,T-1],[T]).
当您准备数据并且想要预测下一帧时,当然您需要对过去的值(T-5、T-4...)进行精确完美的排序 在块中。你不需要的是从视频中获取精确的连续块。
换句话说,您可以拥有视频 1 中的上述块、视频 9 中的块等。