- 即使我们从理论上理解 LSTM,在将数据拟合到网络时,我们中的许多人仍然对其输入和输出形状感到困惑。 本指南将帮助您了解 LSTM 的输入和输出形状。
让我们首先了解 LSTM Keras 中的 Input 及其形状。 LSTM 的输入数据如下图所示。
您始终必须提供一个三维数组作为 LSTM 网络的输入。 其中第一个维度表示batch_size,第二个维度表示time_steps,第三个维度表示一个输入序列中的单元数units。 例如,输入形状看起来像 (batch_size, time_steps, units)。 让我们看一个 Keras 中的例子。
让我们看看 input_shape 参数。 虽然看起来输入是一个 2D 数组,但我们实际上必须传递一个形状为 (batch_size, 2, 10) 的 3D 数组。 表示时间步长的值为 2,输入单位为 10,您可以在将数据拟合到网络时灵活地提供任何批量大小。
您还可以提供一个名为 batch_input_shape 的参数而不是 input_shape。 不同之处在于您现在必须提供固定的批量大小,并且您的输入数组形状将类似于 (8, 2, 10)。 如果您尝试输入 8 以外的不同批次大小,则会出现错误。
现在,让我们看看 LSTM 网络中的输出及其形状。
让我们看看其他的参数。 参数units表示 LSTM 中输出单元的数量,这里是 3。 所以输出形状是 (None, 3)。 输出的第一维是 None 因为我们事先不知道批量大小。 所以实际的输出形状将是 (batch_size, 3) 这里。
在这里我们看到我预先定义了batch_size=8,那么很自然的输出形状变成了(8, 3)
现在,看看另一个参数 return_sequences。 这个参数告诉是否在每个时间步而不是最后一个时间步返回输出。 当我们将 return_sequences 设置为 True 时,输出形状变为 3D 数组,而不是 2D 数组。 现在输出的形状是 (8, 2, 3)。 我们看到中间有一个额外的维度表示时间步长。
概括
LSTM 的输入总是一个 3D 数组。 (batch_size, time_steps, 单位)
LSTM 的输出可以是 2D 数组或 3D 数组,具体取决于 return_sequences 参数。
如果 return_sequence 为 False,则输出为二维数组。 (batch_size, units)
如果 return_sequence 为 True,则输出为 3D 数组。 (batch_size, time_steps, units)
参考资料
https://shiva-verma.medium.com/understanding-input-and-output-shape-in-lstm-keras-c501ee95c65e