重新调整Keras中长短期记忆网络的输入数据
你可能很难理解如何为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模型的多个平行序列数据并定义输入层。
- SQL Server 2005:一个使用新创建的User的问题和解决方法
- Audit Logging-Stored Procedure
- Linux进程间通信(四) - 共享内存
- 扩展UltraGrid控件实现对所有数据行的全选功能[Source Code下载]
- Linux进程间通信(一) - 管道
- Linux进程间通信(二) - 消息队列
- Linux进程间通信(三) - 信号
- 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承
- Linux进程间通信(IPC)机制总览
- 负载均衡 - 综述
- 浅谈ASP.NET的Postback
- WCF版的PetShop之一:PetShop简介[提供源代码下载]
- 维吉尼亚密码及程序实现
- 迪菲-赫尔曼密钥交换
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R中的stack和unstack函数
- 第33期:上海自来水来自海上,回文字符串验证!
- nginx location配置
- 快速学习-RocketMQ Dledger快速搭建
- 原创 | 非典型算法题,用程序和电脑玩一个游戏
- 快速学习-RocketMQ Dledger集群搭建
- 原创 | 你能想出解法,让你的基友少氪金吗?
- 快速学习-ElasticJob运维平台
- 第34期:最后一个单词的长度(高频)
- 原创 | 学会这三个命令,你就不再是git只会用三板斧的菜鸟了
- 构建Flink第一个应用程序
- 第35期:从 DFS 学习二叉树!(适合小白)
- ROS自平衡车案例学习(机器人操作系统+现代控制理论融合)
- Git 不能提交空目录?我也是醉了!
- 相关矩阵、特征、预测、股市!(附代码)