重新调整Keras中LSTM长短期记忆网络的输入数据

2017年09月05日 由 xiaoshan.xiang 发表 2482 0
你可能很难理解如何为LSTM模型的输入准备序列数据。

你可能经常会对如何定义LSTM模型的输入层感到困惑。也可能对如何将数字的1D或2D矩阵序列数据转换为LSTM输入层所需的3D格式存在一些困惑。

在本教程中,你将了解如何定义LSTM模型的输入层,以及如何重新调整LSTM模型加载的输入数据。

完成本教程后,你将知道:

如何定义一个LSTM输入层。

如何对一个LSTM模型的一维序列数据进行重新调整,并定义输入层。

如何为一个LSTM模型重新调整多个并行序列数据,并定义输入层。

让我们开始吧。

教程概述


本教程分为四个部分;它们是:

1 .LSTM输入层

2.单个输入样本的LSTM的示例

3 .具有多个输入特性的LSTM的示例

4.LSTM输入的提示

LSTM输入层


LSTM输入层是由网络上第一个隐藏层的“input_shape”参数指定的。

这会让初学者感到困惑。例如,下面是一个包含一个隐藏的LSTM层和密集输出层的网络示例。
model = Sequential()
model.add(LSTM(32))
model.add(Dense(1))

在本例中,LSTM()层必须指定输入的形状。每一个LSTM层的输入必须是三维的。

输入的三个维度是:

  • 样本:一个序列就是一个样本。批处理由一个或多个样本组成。

  • 时间步骤:一个时间步骤是样本中观察的一个点。

  • 特性:一个特征是一个时间步骤的观察。


这意味着,输入层在拟合模型和预测时期望得到一个三维数据数组,即使数组的特定维度包含一个单一值,例如一个样本或一个特性。

当定义LSTM网络的输入层时,LSTM网络假设你有1个或更多的样本,并要求你指定时间步骤的数量和特性的数量。你可以通过为“input_shape”输入参数指定一个元组来实现这一点。

例如,下面的模型定义了一个输入层,它期望一个或多个样本、50个时间步骤和两个特性。
model = Sequential()
model.add(LSTM(32, input_shape=(50, 2)))
model.add(Dense(1))

现在我们已经知道了如何定义LSTM输入层和3D输入的期望,让我们来看看为LSTM准备数据的示例。

具有单个输入样本的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数组上使用reshape() 函数,将这个一维数组重新调整为具有1个示例、10个时间步骤、每一步都有1个特性的三维数组。

reshape() 函数调用一个数组时需要一个参数,这是一个定义数组新形状的元组。我们不能通过任何数字元组,重新调整必须均匀地重新组织数组中的数据。
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)

运行该示例打印单个示例的新3D形状。
(1, 10, 1)

现在可以将此数据用作带有input_shape(10,1)的LSTM的输入(X)。
model = Sequential()
model.add(LSTM(32, input_shape=(10, 1)))
model.add(Dense(1))

具有多个输入特性的LSTM的示例


考虑你有多个并行系列作为模型输入的情况。

例如,可以是两个平行的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

我们可以将这些数据定义为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]])

这个数据可以被框定为一个包含10个时间步骤和2个特征的样本。

它可以被重新调整为3D数组:
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)

运行该示例,输出单个示例的新3D形状。
(1, 10, 2)

现在可以将此数据用作带有input_shape(10,1)的LSTM的输入(X)。
model = Sequential()
model.add(LSTM(32, input_shape=(10, 2)))
model.add(Dense(1))

LSTM输入的提示


本节列出了一些提示,帮助你为LSTMs准备输入数据。

  • LSTM输入层必须是3 D的。

  • 3个输入维度的含义是:样品,时间的步骤和特性。

  • LSTM输入层由第一个隐藏层的input_shape参数定义。

  • input_shape参数需要一个包含两个值的元组定义步骤和时间特性。

  • 样本的数量被认为是1或更多。

  • NumPy数组的 reshape() 函数可以用来重新调整一维,二维和三维数据。

  • reshape() 函数将元组作为定义新形状的参数。


延伸阅读


如果你正在深入研究,本节将提供有关主题的更多资源。

  • 复发层Keras API(链接地址为https://keras.io/layers/recurrent/)

  • 数组reshape() 函数API(链接地址为https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.reshape.html)

  • 如何将Python中的时间序列转换成监督学习问题(链接地址为http://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/)

  • 将时间序列预测作为监督学习(链接地址为http://machinelearningmastery.com/time-series-forecasting-supervised-learning/)


摘要


在本教程中,你了解了如何定义LSTMs的输入层,以及如何将序列数据重新调整为LSTMs的输入。

具体来说,你学会了:

如何定义一个LSTM输入层。

如何重新调整LSTM模型的一维序列数据和定义输入层。

如何重新调整LSTM模型的多个平行序列数据并定义输入层。
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消