长短期记忆(LSTM)系列_LSTM的数据准备(1)——如何重塑Keras中长短期内存网络的输入数据

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangwohenmai1/article/details/84786369

源码地址:

https://github.com/yangwohenmai/LSTM/tree/master/%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86(LSTM)/LSTM%E7%9A%84%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87/%E9%87%8D%E5%A1%91Keras%E4%B8%AD%E9%95%BF%E7%9F%AD%E6%9C%9F%E5%86%85%E5%AD%98%E7%BD%91%E7%BB%9C%E7%9A%84%E8%BE%93%E5%85%A5%E6%95%B0%E6%8D%AE

LSTM输入层

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

这会让初学者感到困惑。

例如,下面是具有一个隐藏的LSTM层和一个密集输出层的网络的示例。

model = Sequential()

model.add(LSTM(32))

model.add(Dense(1))


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

这个输入的三个维度是:

  • 样品。一个序列是一个样本。批次由一个或多个样品组成。
  • 时间步骤。一个步骤是样品中的一个观察点。
  • 特征。一个特征是在一个时间步骤的一个观察。

这意味着输入层在拟合模型和进行预测时需要3D数据数组,即使数组的特定维度包含单个值,例如一个样本或一个特征。

定义LSTM网络的输入层时,网络假定您有一个或多个样本,并要求您指定时间步数和要素数。您可以通过为“ input_shape ”参数指定元组来完成此操作。

例如,下面的模型定义了一个输入层,该输入层需要1个或更多样本,50个时间步长和2个特征。

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
# 将这个数字序列定义为NumPy数组
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个特征(列)
data = data.reshape((1, 10, 1))
print(data.shape)
print(data)

 

1

(1, 10, 1)
[[[0.1]
  [0.2]
  [0.3]
  [0.4]
  [0.5]
  [0.6]
  [0.7]
  [0.8]
  [0.9]
  [1. ]]]

运行该示例将打印单个样本的新3D形状。

此数据现在可以用作LSTM的输入(X),其input_shape为(10,1)。

model = Sequential()

model.add(LSTM(32, input_shape=(10, 1)))

model.add(Dense(1))

 

具有多个输入功能的LSTM示例

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

例如,这可能是两个并行的10个值系列:

1

2

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]])


它可以重新整形为3D数组,如下所示:该数据可以被构造为1个样本,具有10个时间步长和2个特征。

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]])
# 被构造为1个样本,具有10个时间步长和2个特征
data = data.reshape(1, 10, 2)
print(data.shape)
print(data)

运行该示例将打印单个样本的新3D形状。

1

(1, 10, 2)
[[[0.1 1. ]
  [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.1]]]

此数据现在可以用作LSTM的输入(X),其input_shape为(10,2)。

model = Sequential()

model.add(LSTM(32, input_shape=(10, 2)))

model.add(Dense(1))

 

 

展开阅读全文

没有更多推荐了,返回首页