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

时间:2022-05-02
本文章向大家介绍重新调整Keras中长短期记忆网络的输入数据,主要内容包括教程概述、LSTM输入层、具有单个输入样本的LSTM的示例、具有多个输入特性的LSTM的示例、LSTM输入的提示、延伸阅读、摘要、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

你可能很难理解如何为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 numpyimport 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 numpyimport 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个值:

series1:0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0
series2:1.0,0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1

我们可以将这些数据定义为10行2列的矩阵:

from numpyimport 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 numpyimport 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模型的多个平行序列数据并定义输入层。