keras上手系列之:序列到序列预测问题

2023-05-16

LSTM序列到序列模型种类

LSTM 序列到序列(seq to seq)问题建模, 根据问题和数据本身的特点,可以分为几种不同:
- 一对一(one to one)
- 多对一(many to one)
- 一对多(one to many)
- 多对多(many to many)

一个时间步预测

(1) 一对一(one to one)
这种模型是根据过去的一个时间点上的数据,预测下一个时间点的数据. 典型的问题结构是:
y(t+1) = f(x(t))
对应的LSTM网络结构是:
这里写图片描述
按照timestep展开后, 网络结构如下:
这里写图片描述
一对一模型用keras建模实现如下:

model = Sequential()
model.add(LSTM(..., input_shape=(1, features)))
model.add(Dense(1))

值得注意的是, 数据本身可以是一个向量, 也就是说, 在一个时间点上, 对应的数据本身是多维的.
整个网络的输入是1个长度为features的向量, 输出是标量。
(2) 多对一(many to one)
此时,网络输入的时间步是大于1的, 但是输出的预测时间步只是1.
y(t+1) = f(x(t-n), x(t-n+1), …, x(t))
此时的网络结构为:
这里写图片描述

model = Sequential()
features = 10
vectors = 3
model.add(LSTM(8, input_shape=(vectors, features)))
model.add(Dense(1))
print(model.summary())

可以得到:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_27 (LSTM)               (None, 8)                 608       
_________________________________________________________________
dense_22 (Dense)             (None, 1)                 9         
=================================================================
Total params: 617
Trainable params: 617
Non-trainable params: 0
_________________________________________________________________
None

多个时间步预测

TimeDistributed()包装器

要输出对未来多个时间步上的预测, 就必须使用TimeDistributed()包装器, 将输出上一层网络的输出在时间轴上展开. 关于TimeDistributed()包装器, F. Chollet(Keras的作者)解释说:
TimeDistributedDense将同样的密集(全连接)操作应用到3D张量的每一个时间间隔上。
TimeDistributedDense applies a same Dense (fully-connected) operation to every timestep of a 3D tensor.

这一点可以用一个简单的例子说明. 例如如下的单层LSTM网络:

model = Sequential()
model.add(LSTM(1, input_shape=(10,1)))
print(model.summary())

得到:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_15 (LSTM)               (None, 1)                 12        
=================================================================
Total params: 12
Trainable params: 12
Non-trainable params: 0
_________________________________________________________________
None

另外一个单层LSTM网络外面还增加了TimeDistributed()包装器.

model = Sequential()
model.add(TimeDistributed(LSTM(1, input_shape=(None, 10, 1))))
print(model.summary())

得到:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
time_distributed_14 (TimeDis (None, None, 1)           12        
=================================================================
Total params: 12
Trainable params: 12
Non-trainable params: 0
_________________________________________________________________
None

得到的网络参数都是12. 可见, TimeDistributed()包装器没有引入新的参数, 而是将同样的网络分别在batch中的每个样本上都应用了.正如这个包装器的命名,是将训练数据的batch视为在时间轴上的展开. 这一点上可以从Output Shape中看出来。 对于第一个单层LSTM网络,输出的数据维度就是[batch, 1], 第二个LSTM网络的输出是[batch, batch, 1].
有了对TimeDistributed()包装器的基本认识,我们就可以理解下面的多时间步预测问题。

多时间步上的预测

(3) 一对多(one to many)

这种问题的典型结构是:
y(t+1), y(t+2) = f(x(t))
这里写图片描述
也就是说, 根据过去一步的数据, 预测未来两步的数据. 用keras建模应该是:

model = Sequential()
features = 8
model.add(LSTM(out_dim, input_shape(1, features), return_sequences=True))
model.add(TimeDistributed(Dense(1)))

这里TimeDistributed() 包装器将第一层LSTM的输出序列按照时间顺序排列好. 例如上面LSTM网络的输入数据是[batch, 1, features], 那么输出是: [batch, 1, 20]
在Dense层,增加了TimeDistributed()包装器,可以得到输出的维数是:[batch, 1, 1]
这个模型的结构和输出数据的维数是:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_18 (LSTM)               (None, 1, 20)             2320      
_________________________________________________________________
time_distributed_17 (TimeDis (None, 1, 1)              21        
=================================================================
Total params: 2,341
Trainable params: 2,341
Non-trainable params: 0
_________________________________________________________________
None

output_shape is : (None, 1, 1)

网络的输入是1个长度是8维的向量,输出是标量。

(4) 多对多(many to many)

多对多问题的典型结构是:
y(t+1), y(t+2), …, y(t+n) = f(y(t-n), y(t-n+1), …, y(t))
这里写图片描述

用keras建模:

from keras.models import Sequential
from keras.layers import LSTM, Dense, TimeDistributed
model = Sequential()
in_features = 8
n_in = 10
out_dim = 6
out_features = 12
model.add(LSTM(out_dim, input_shape=(n_in, in_features), return_sequences=True))
model.add(TimeDistributed(Dense(out_features)))
print(model.summary())

得到:

Using TensorFlow backend.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 10, 6)             360       
_________________________________________________________________
time_distributed_1 (TimeDist (None, 10, 12)            84        
=================================================================
Total params: 444
Trainable params: 444
Non-trainable params: 0
_________________________________________________________________
None

网络的输入是10个长度为8的向量,输出是长度是12的向量。

如果输入序列的长度与输出序列不一致, 那么需要在网络中增加RepeatVector()层.

from keras.layers import RepeatVector
model = Sequential()
n_in = 120
n_out = 60
model.add(LSTM(60, input_shape=(n_in, 1)))
model.add(RepeatVector(n_out))
model.add(LSTM(20, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mse',  optimizer='adam')
print(model.summary()) 

得到:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_4 (LSTM)                (None, 60)                14880     
_________________________________________________________________
repeat_vector_1 (RepeatVecto (None, 60, 60)            0         
_________________________________________________________________
lstm_5 (LSTM)                (None, 60, 20)            6480      
_________________________________________________________________
time_distributed_2 (TimeDist (None, 60, 1)             21        
=================================================================
Total params: 21,381
Trainable params: 21,381
Non-trainable params: 0
_________________________________________________________________
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

keras上手系列之:序列到序列预测问题 的相关文章

  • JAVA 访问windows共享文件夹

    一 使用技术 JCIFS框架对Windows共享文件夹进行读写 xff0c 使用了SMB通信协议 xff0c 它为局域网内不同的计算机之间提供文件和打印机等资源共享服务 二 共享文件夹设置 测试共享文件夹机器windows版本为win10家
  • 前端代码调试:Webstorm调试js

    前言 目前前端开发 JavaScript的debug一般都是用chrome和firefox的开发者工具进行调试 xff0c 浏览器工具使用不方便 xff0c webstorm支持了在代码上打断点 xff0c 在编辑器里debug js代码
  • CV:基本概念和工具

    文章目录 计算机视觉像素 xff0c 颜色 xff0c 通道 xff0c 图像和颜色空间的概念图像文件后缀有损压缩和无损压缩 Python的计算机视觉库PIL xff1a python 图像处理类库载入PIL库基本操作命令 openCVop
  • OCR技术概览

    OCR技术概览 OCR Optical Character Recognition 光学字符识别技术主要分为手写体识别和印刷体识别两类 印刷体识别比手写体识别要简单 因为印刷体更规范 字体来自于计算机字库 尽管印刷过程中可能会发生不清晰 粘
  • CV:图像色彩空间及色彩处理

    文章目录 基本概念RGB空间HSV空间HSL空间 色彩变换灰度变换色彩反向 调整像素区间增强对比度直方图均衡化 图像平滑 减少噪声图像平均高斯滤波 图像梯度sobel算子 scharr算子prewitt算子Laplacian 算子 参考及更
  • OpenCV角点检测: Harris算子, ShiTomasi算子

    角点检测 角点的特征检测与匹配是Computer Vision 应用总重要的一部分 xff0c 这需要寻找图像之间的特征建立对应关系 点 xff0c 也就是图像中的特殊位置 xff0c 是很常用的一类特征 xff0c 点的局部特征也可以叫做
  • 集成学习:让算法和算法赛跑

    文章目录 集成学习的基本概念构建弱分类器 xff1a 决策树自助采样法bootstrappingbootstrapping的核心思想bootstrapping与permutation的区别 baggingboosting为何bagging会
  • backbone模型:FCN、SRN、STN

    文章目录 FCN网络CNN图像分割模型结构FCN github资源FCN的优缺点 SRN 网络什么是空间规整 spatial regularization xff09 SRN网络github资源 STN网络空间变换器localisation
  • docker部署机器学习/深度学习模型的容器化方案

    文章目录 什么是dockerdocker的优点 docker image镜像Dockerfile 文件Dockerfile配置例子 创建docker镜像 docker container 容器模型部署参考和更多阅读 docker部署机器学习
  • RNN模型训练经验总结

    文章目录 RNN模型训练经验总结数据准备 look at your data 小步试错 搭建模型设置端到端的训练评估框架 forward propagation设置激活函数dropout back propagation设置学习率 lear
  • 算法的时间复杂度和空间复杂度

    如何评价算法的性能 定义 一个算法中的语句执行次数称为 语句频度 或 时间频度 约定 检验算法的效率 xff0c 主要考虑 最坏时间复杂度 和 平均时间复杂度 一般不特别说明 xff0c 讨论的时间复杂度均是最坏情况下的时间复杂度 时间复杂
  • 【LeetCode】LCS最长公共子序列

    最长公共子序列 题目描述思路分析递归结构算法实现输出最长子序列算法实现 题目描述 思路分析 设A 61 a0 xff0c a1 xff0c xff0c am xff0c B 61 b0 xff0c b1 xff0c xff0c bn xff
  • 升级到tensorflow2.0

    目录 从tensorflow1 x升级到2 x方案一 xff1a 依然使用tf 1 x的脚本方案二 xff1a 升级项目代码到2 x tensorflow2 0推出以后 xff0c 全面拥抱keras xff0c 简化了API接口 xff0
  • tensorflow2.0系列(1):张量

    目录 tensor xff1a 张量张量的数据类型Dtype类函数tf as type xff1a 定义Dtype类型对象tf dtypes cast xff1a 将张量映射 投射为新的类型tf dtypes complex xff1a 将
  • tensorflow 2.0系列(3):eager execution和计算图

    目录 tf 2 0 的新特性 xff1a eager execution开启eager模式关闭eager模式 构建图默认图创建多个计算图启动会话 从公式到计算图绘制心形曲线开根号线性回归 tf 2 0 的新特性 xff1a eager ex
  • tensorflow2.0系列(2):张量的运算

    目录 张量运算tf linalg 模块tf math模块常用的代数函数tf math segment 张量运算 tensorflow定义了很多张量的基本运算 xff0c 由于张量的特殊属性 xff0c 其运算操作主要有两类 xff0c 一类
  • 那些重要但是容易被忽略的python编程基础知识

    目录 变量类型标准数据类型 字典字典的内置函数 amp 方法 字符串前符号 python很容易上手 xff0c 工具包特别多 xff0c 入门后就特别容易忽略python的基本特性 这里将特别关注python那些特别基础 xff0c 重要但
  • 常见深度神经网络模型图

    from tensorflow learn in one day by Krishna Rungta
  • tensorflow2.0系列(4): Eager Execution和Auto Graph

    目录 静态图的弊端Eager模式Eager execution的基本特性对 numpy 的支持 Auto Graph 动态图static analysis VS dynamic flow局部参数的可见域python collections
  • Eclipse离线安装ADT插件

    Eclipse安装 ADT插件 但是由于某些不可抗拒的原因连上 https dl ssl google com android eclipse 后 xff0c 始终无法更新 ADT插件 卡死在 Fetchingcontent jar上 解决

随机推荐

  • ubuntu在shell中把文件拷贝进U盘

    1 创建挂载位置 xff0c 例如 sudo mkdir mnt u 这个位置只要建好 xff0c 以后就可以不用再建了 2 用mount命令将U盘挂载在这个位置 sudo mount dev sdb1 mnt u 注意U盘的盘符不一定是
  • linux文件管理

    linux文件管理 计算机操作系统都采用了目录树的文件结构 linux中 xff1a 符号名称 根目录 bin常见用户口令 boot内核和启动文件 dev设备文件 home系统默认的普通用户主目录 etc系统和服务配置文件 lib系统函数库
  • C++和Windows平台的一些书籍

    从2010年学习编程以来 xff0c 到现在有差不多3年时间了 xff0c 过的真快啊 目前在深圳工作 xff0c 主要使用的是C 43 43 语言 xff0c 那么我就说说C 43 43 和Windows平台的书籍吧 1 C primer
  • ubuntu上运行C程序

    ubuntu版本为Ukylin14 04LTS 首先配置编辑器vim step1 xff1a 查看系统是否安装vim 打开终端 xff0c 输入vi xff0c 按下tab键 xff0c 如果列表里没有vim xff0c 说明系统没有安装
  • 怎么让ubuntu变得更加好用

    ubunut14 04LTS版本其实已经很好用了 但是也有一些小小的美中不足 以下设置是陆续收集 摸索到的可以让系统更好用的方法 1 在终端打开已经安装的应用程序时 xff0c 总是会显示一些错误信息 在 bin下添加x文件 xff1a c
  • linux命令(1):touch

    touch 命令 功能说明 xff1a 改变文件或目录时间 xff0c 包括存取时间和更改时间 语 法 xff1a 补充说明 xff1a 使用touch指令可更改文件或目录的日期时间 最常用用法 xff1a touch fileA 如果fi
  • bash shell命令(1);、&&、||

    xff1b 命令 按照先后顺序一次执行多个命令 xff0c 命令之间用 xff1b 分割 xff1a command 1 command 2 command 3 amp amp 命令 如果前一个命令 command 1 顺利执行 xff0c
  • linux命令(2):less

    less工具也是对文件或其它输出进行分页显示的工具 xff0c 比more的功能更强大 命令格式 xff1a less 参数 文件1 xff08 文件2 xff09 命令功能 xff1a less 与 more 类似 xff0c 但使用 l
  • [zz] linux下vi或vim操作Found a swap file by the name的原因及解决方法

    在linux下用vi或vim打开Test java文件时 root 64 localhost tmp vi Test java 出现了如下信息 xff1a E325 ATTENTION Found a swap file by the na
  • ubuntu中使用判断符号[]

    鸟哥的私房菜p270中13 3 2使用 符号有这样一个例子 xff1a vim sh06 sh 脚本内容如下 xff1a bin bash Program This program shows the user 39 s choice Hi
  • 深度学习caffe框架(1):如何快速上手caffe?

    初识caffe 安装caffe跑一个例子mnist配置caffe框架的深度学习网络结构输入数据 数据层的定义图片数据如何保存为lmdb格式 模型的保存和读取 caffe的代码层次参考 初识caffe 安装caffe 跑一个例子 mnist
  • 深度学习caffe框架(2): layer定义

    caffe的代码层次 首先让我们回顾一下caffe的代码层次 blob layer net和solver 其中blob是数据结构 layer是网络的层 net是将layer搭建成的网络 solver是网络BP时候的求解算法 本节主要介绍ca
  • 安装Qt及相关问题解决

    安装Qt及相关问题解决 Download Qt 1 Qt下载 关于Qt下载 xff0c 官网可以下载 但是需要填一大堆信息 非常麻烦 可以打开下面的链接 xff0c 里面有各版本Qt http download qt io archive
  • 可编程的SQL是什么样的?

    背景 如果你使用传统编程语言 xff0c 比如Python xff0c 那么恭喜你 xff0c 你可能需要解决大部分你不需要解决的问题 xff0c 用Python你相当于拿到了零部件 xff0c 而不是一辆能跑的汽车 你花了大量时间去组装汽
  • matplotlib 绘制动画

    matplotlib动画 载入matplotlib动画绘制工具 span class hljs import span class hljs keyword import span matplotlib animation span cla
  • Robust Real-Time Extreme Head Pose Estimation

    基本思路 xff1a 用RGB D 的摄像头 xff0c 利用RGB和深度信息对人脸进行三位建模和合成 之后建立了一个由33个人不同头部姿态点云合成数据组成的数据库Dali3DHP xff0c 基于级联决策树 xff08 5个 xff09
  • 如何将ipython的历史记录导出到.py文件中?

    python绝对是生产力工具 真的太好用了 python jupyter提供了非常好的交互编程方式 最棒的就是在数据分析过程中 可以把想法和代码实现放在一起 大大加速了分析过程 也使得代码的可读性更好 回到上面的问题 两种办法解决 xff1
  • keras上手系列之: 模型的保存

    如何将训练好的网络进行保存以便以后使用 进行后续的研究呢 首先 定义一个简单的LSTM模型 span class hljs keyword from span keras models span class hljs keyword imp
  • keras上手系列之: 代码的整体框架

    keras的名字来源于希腊史诗 lt 奥德赛 gt 里的牛角之门 Gate of Horn 是追梦者之路 是梦想实现之门 Those that come through the Ivory Gate cheat us with empty
  • keras上手系列之:序列到序列预测问题

    LSTM序列到序列模型种类 LSTM 序列到序列 seq to seq 问题建模 根据问题和数据本身的特点 可以分为几种不同 一对一 one to one 多对一 many to one 一对多 one to many 多对多 many t