原文:https://machinelearningmastery.com/reshape-input-data-long-short-term-memory-networks-keras/
最后更新于 2019 年 8 月 14 日
很难理解如何准备序列数据输入 LSTM 模型。
通常,对于如何定义 LSTM 模型的输入层存在困惑。
对于如何将可能是 1D 或 2D 数字矩阵的序列数据转换为 LSTM 输入图层所需的 3D 格式,也存在困惑。
在本教程中,您将了解如何定义 LSTM 模型的输入图层,以及如何为 LSTM 模型重塑加载的输入数据。
完成本教程后,您将知道:
- 如何定义 LSTM 输入层。
- 如何为 LSTM 模型重塑一维序列数据并定义输入图层。
- 如何为 LSTM 模型重塑多个并行系列数据并定义输入图层。
用我的新书Python 的长短期记忆网络启动你的项目,包括循序渐进教程和所有示例的 Python 源代码文件。
我们开始吧。
如何在 Keras 重塑长短期记忆网络的输入 图片由全球景观论坛提供,保留部分权利。
本教程分为 4 个部分;它们是:
- LSTM 输入层
- 具有单输入样本的 LSTM 示例
- 具有多种输入功能的 LSTM 示例
- LSTM 输入提示
LSTM 输入层由网络第一个隐藏层上的“ input_shape ”参数指定。
这可能会让初学者感到困惑。
例如,下面是具有一个隐藏 LSTM 层和一个密集输出层的网络示例。
model = Sequential()
model.add(LSTM(32))
model.add(Dense(1))
在本例中,LSTM()图层必须指定输入的形状。
每个 LSTM 层的输入必须是三维的。
这种输入的三个维度是:
- 样品。一个序列就是一个样本。一批由一个或多个样品组成。
- 时间步长。一个时间步长是样本中的一个观察点。
- 功能。一个特点是一步一个观察。
这意味着,在拟合模型和进行预测时,输入图层需要一个三维数据阵列,即使阵列的特定维度包含单个值,例如一个样本或一个特征。
定义 LSTM 网络的输入图层时,网络假设您有 1 个或更多样本,并要求您指定时间步长数和要素数。您可以通过为“ input_shape ”参数指定一个元组来实现这一点。
例如,下面的模型定义了一个需要 1 个或更多样本、50 个时间步长和 2 个特征的输入层。
model = Sequential()
model.add(LSTM(32, input_shape=(50, 2)))
model.add(Dense(1))
既然我们已经知道了如何定义 LSTM 输入图层和对 3D 输入的期望,那么让我们来看一些如何为 LSTM 准备数据的示例。
考虑这样的情况:您有一个由多个时间步骤组成的序列和一个特性。
例如,这可能是 10 个值的序列:
0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
我们可以将这个数字序列定义为一个 NumPy 数组。
from numpy import array
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
然后,我们可以在 NumPy 数组上使用*重塑()*函数,将这个一维数组重塑为一个三维数组,每个时间步长有 1 个样本、10 个时间步长和 1 个特征。
当在数组上调用时,*重塑()*函数接受一个参数,该参数是定义数组新形状的元组。我们不能传入任何一组数字;整形必须均匀地重新组织数组中的数据。
data = data.reshape((1, 10, 1))
一旦重塑,我们就可以打印新的阵列形状。
print(data.shape)
将所有这些放在一起,下面列出了完整的示例。
from numpy import array
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
data = data.reshape((1, 10, 1))
print(data.shape)
运行该示例将打印单个样本的新三维形状。
(1, 10, 1)
该数据现在可以用作输入( X )到输入形状为(10,1)的 LSTM。
model = Sequential()
model.add(LSTM(32, input_shape=(10, 1)))
model.add(Dense(1))
考虑有多个并行系列作为模型输入的情况。
例如,这可能是由 10 个值组成的两个并行系列:
series 1: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
series 2: 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1
我们可以将这些数据定义为 2 列 10 行的矩阵:
from numpy import array
data = array([
[0.1, 1.0],
[0.2, 0.9],
[0.3, 0.8],
[0.4, 0.7],
[0.5, 0.6],
[0.6, 0.5],
[0.7, 0.4],
[0.8, 0.3],
[0.9, 0.2],
[1.0, 0.1]])
该数据可以被构建为具有 10 个时间步长和 2 个特征的 1 个样本。
它可以按如下方式重新造型为三维阵列:
data = data.reshape(1, 10, 2)
将所有这些放在一起,下面列出了完整的示例。
from numpy import array
data = array([
[0.1, 1.0],
[0.2, 0.9],
[0.3, 0.8],
[0.4, 0.7],
[0.5, 0.6],
[0.6, 0.5],
[0.7, 0.4],
[0.8, 0.3],
[0.9, 0.2],
[1.0, 0.1]])
data = data.reshape(1, 10, 2)
print(data.shape)
运行该示例将打印单个样本的新三维形状。
(1, 10, 2)
该数据现在可以用作输入( X )到输入形状为(10,2)的 LSTM。
model = Sequential()
model.add(LSTM(32, input_shape=(10, 2)))
model.add(Dense(1))
有关准备数据的完整端到端工作示例,请参见本文:
本节列出了一些提示,可以帮助您准备 LSTMs 的输入数据。
- LSTM 输入图层必须是 3D 的。
- 3 个输入维度的含义是:样本、时间步长和特征。
- LSTM 输入图层由第一个隐藏图层上的输入形状参数定义。
- input_shape 参数采用两个值的元组来定义时间步长和特征的数量。
- 假设样本数为 1 或更多。
- NumPy 阵列上的*重塑()*功能可用于将 1D 或 2D 数据重塑为 3D。
- *重塑()*函数将元组作为定义新形状的参数。
如果您想了解更多信息,本节将提供更多相关资源。
在本教程中,您发现了如何为 LSTMs 定义输入图层,以及如何重塑序列数据以输入到 LSTMs。
具体来说,您了解到:
- 如何定义 LSTM 输入层。
- 如何为 LSTM 模型重塑一维序列数据并定义输入图层。
- 如何为 LSTM 模型重塑多个并行系列数据并定义输入图层。
你有什么问题吗? 在下面的评论中提问,我会尽力回答。