目录:
1、传统的BP网络和CNN网络
2、LSTM网络
3、LSTM的输入结构
4、pytorch中的LSTM
4.1 pytorch中定义的LSTM模型
4.2 喂给LSTM的数据格式
4.3 LSTM的output格式
5、LSTM和其他网络组合

最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大的问题就是LSTM在传统BP网络上加上时间步后,其结构就很难理解了,同时其输入输出数据格式也很难理解,网络上有很多介绍LSTM结构的文章,但是都不直观,对初学者是非常不友好的。我也是苦苦冥思很久,看了很多资料和网友分享的LSTM结构图形才明白其中的玄机。

1、传统的BP网络和CNN网络

BP网络和CNN网络没有时间维,和传统的机器学习算法理解起来相差无几,CNN在处理彩色图像的3通道时,也可以理解为叠加多层,图形的三维矩阵当做空间的切片即可理解,写代码的时候照着图形一层层叠加即可。如下图是一个普通的BP网络和CNN网络。

BP网络
CNN网络

图中的隐含层、卷积层、池化层、全连接层等,都是实际存在的,一层层前后叠加,在空间上很好理解,因此在写代码的时候,基本就是看图写代码,比如用keras就是:

# 示例代码,没有实际意义
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
model.add(Dropout(0.25))                          # 添加dropout层model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷积层
model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化层
model.add(Dropout(0.25))                          # 添加dropout层....   # 添加其他卷积操作model.add(Flatten())                            # 拉平三维数组为2维数组
model.add(Dense(256, activation='relu'))        添加普通的全连接层
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))....  # 训练网络

2、LSTM网络

当我们在网络上搜索看LSTM结构的时候,看最多的是下面这张图:

RNN网络

这是RNN循环神经网络经典的结构图,LSTM只是对隐含层节点A做了改进,整体结构不变,因此本文讨论的也是这个结构的可视化问题。

中间的A节点隐含层,左边是表示只有一层隐含层的LSTM网络,所谓LSTM循环神经网络就是在时间轴上的循环利用,在时间轴上展开后得到右图。

看左图,很多同学以为LSTM是单输入、单输出,只有一个隐含神经元的网络结构,看右图,以为LSTM是多输入、多输出,有多个隐含神经元的网络结构,A的数量就是隐含层节点数量。

WTH?思维转不过来啊。这就是传统网络和空间结构的思维。

实际上,右图中,我们看Xt表示序列,下标t是时间轴,所以,A的数量表示的是时间轴的长度,是同一个神经元在不同时刻的状态(Ht),不是隐含层神经元个数。

我们知道,LSTM网络在训练时会使用上一时刻的信息,加上本次时刻的输入信息来共同训练。

举个简单的例子:在第一天我生病了(初始状态H0),然后吃药(利用输入信息X1训练网络),第二天好转但是没有完全好(H1),再吃药(X2),病情得到好转(H2),如此循环往复知道病情好转。因此,输入Xt是吃药,时间轴T是吃多天的药,隐含层状态是病情状况。因此我还是我,只是不同状态的我。

实际上,LSTM的网络是这样的:

LSTM网络结构

上面的图表示包含2个隐含层的LSTM网络,在T=1时刻看,它是一个普通的BP网络,在T=2时刻看也是一个普通的BP网络,只是沿时间轴展开后,T=1训练的隐含层信息H,C会被传递到下一个时刻T=2,如下图所示。上图中向右的五个常常的箭头,所的也是隐含层状态在时间轴上的传递。

注意,图中H表示隐藏层状态,C是遗忘门,后面会讲解它们的维度。

3、LSTM的输入结构

为了更好理解LSTM结构,还必须理解LSTM的数据输入情况。仿照3通道图像的样子,在加上时间轴后的多样本的多特征的不同时刻的数据立方体如下图所示:

三维数据立方体

右边的图是我们常见模型的输入,比如XGBOOST,lightGBM,决策树等模型,输入的数据格式都是这种(N*F)的矩阵,而左边是加上时间轴后的数据立方体,也就是时间轴上的切片,它的维度是(N*T*F),第一维度是样本数,第二维度是时间,第三维度是特征数,如下图所示:

这样的数据立方体很多,比如天气预报数据,把样本理解成城市,时间轴是日期,特征是天气相关的降雨风速PM2.5等,这个数据立方体就很好理解了。在NLP里面,一句话会被embedding成一个矩阵,词与词的顺序是时间轴T,索引多个句子的embedding三维矩阵如下图所示:

4、pytorch中的LSTM

4.1 pytorch中定义的LSTM模型

pytorch中定义的LSTM模型的参数如下

class 

结合前面的图形,我们一个个看。

(1)input_size:x的特征维度,就是数据立方体中的F,在NLP中就是一个词被embedding后的向量长度,如下图所示:

(2)hidden_size:隐藏层的特征维度(隐藏层神经元个数),如下图所示,我们有两个隐含层,每个隐藏层的特征维度都是5。注意,非双向LSTM的输出维度等于隐藏层的特征维度

(3)num_layers:lstm隐层的层数,上面的图我们定义了2个隐藏层。

(4)batch_first:用于定义输入输出维度,后面再讲。

(5)bidirectional:是否是双向循环神经网络,如下图是一个双向循环神经网络,因此在使用双向LSTM的时候我需要特别注意,正向传播的时候有(Ht, Ct),反向传播也有(Ht', Ct'),前面我们说了非双向LSTM的输出维度等于隐藏层的特征维度,而双向LSTM的输出维度是隐含层特征数*2,而且H,C的维度是时间轴长度*2。

4.2 喂给LSTM的数据格式

pytorch中LSTM的输入数据格式默认如下:

input(seq_len, batch, input_size)
参数有:seq_len:序列长度,在NLP中就是句子长度,一般都会用pad_sequence补齐长度batch:每次喂给网络的数据条数,在NLP中就是一次喂给网络多少个句子input_size:特征维度,和前面定义网络结构的input_size一致。

前面也说到,如果LSTM的参数 batch_first=True,则要求输入的格式是:

input(batch, seq_len, input_size)

刚好调换前面两个参数的位置。其实这是比较好理解的数据形式,下面以NLP中的embedding向量说明如何构造LSTM的输入。

之前我们的embedding矩阵如下图:

如果把batch放在第一位,则三维矩阵的形式如下:

其转换过程如下图所示:

看懂了吗,这就是输入数据的格式,是不是很简单。

LSTM的另外两个输入是 h0c0,可以理解成网络的初始化参数,用随机数生成即可。

h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
参数:num_layers:隐藏层数num_directions:如果是单向循环网络,则num_directions=1,双向则num_directions=2batch:输入数据的batchhidden_size:隐藏层神经元个数

注意,如果我们定义的input格式是:

input(batch, seq_len, input_size)

则H和C的格式也是要变的:

h0(batc,num_layers * num_directions, h, hidden_size)
c0(batc,num_layers * num_directions, h, hidden_size)

4.3 LSTM的output格式

LSTM的输出是一个tuple,如下:

output,(ht, ct) = net(input)output: 最后一个状态的隐藏层的神经元输出ht:最后一个状态的隐含层的状态值ct:最后一个状态的隐含层的遗忘门值

output的默认维度是:

output(seq_len, batch, hidden_size * num_directions)
ht(num_layers * num_directions, batch, hidden_size)
ct(num_layers * num_directions, batch, hidden_size)

和input的情况类似,如果我们前面定义的input格式是:

input(batch, seq_len, input_size)

htct的格式也是要变的:

ht(batc,num_layers * num_directions, h, hidden_size)
ct(batc,num_layers * num_directions, h, hidden_size)

说了这么多,我们回过头来看看ht和ct在哪里,请看下图:

output在哪里?请看下图:

5、LSTM和其他网络组合

还记得吗,output的维度等于隐藏层神经元的个数,即hidden_size,在一些时间序列的预测中,会在output后,接上一个全连接层,全连接层的输入维度等于LSTM的hidden_size,之后的网络处理就和BP网络相同了,如下图:

用pytorch实现上面的结构:

import 

当然,有些模型则是将输出当做另一个LSTM的输入,或者使用隐藏层ht,ct的信息进行建模,不一而足。

好了,以上就是我对LSTM的一些学习心得,看完记得关注点赞。

参考:

曾伊言:LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现)​zhuanlan.zhihu.com

XI YANG:6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现​zhuanlan.zhihu.com

刘大力:用「动图」和「举例子」讲讲 RNN​zhuanlan.zhihu.com

LSTM神经网络输入输出究竟是怎样的?​www.zhihu.com

[Pytorch]pytorch中的LSTM模型_人工智能_Forgive Me-CSDN博客​blog.csdn.net

lstm结构图_LSTM模型结构的可视化相关推荐

  1. 漂亮,LSTM模型结构的可视化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 最近在学习LSTM应用在时间序列的预测上,但是遇到一个很大的问题就 ...

  2. 收藏 | LSTM模型结构的可视化

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:知乎  作者 | master苏 链接 | https:// ...

  3. lstm原文_LSTM模型与水文模型在径流模拟中的比较

    学术简报 题目:Comparison of Long Short Term Memory Networks and the Hydrological Model in Runoff Simulatio ...

  4. Pytorch实现的LSTM模型结构

    LSTM模型结构 1.LSTM模型结构 2.LSTM网络 3.LSTM的输入结构 4.Pytorch中的LSTM 4.1.pytorch中定义的LSTM模型 4.2.喂给LSTM的数据格式 4.3.L ...

  5. 【深度学习入门到精通系列】模型结构可视化神器Netron(连.pth都可以~!)

    文章目录 1 Netron 2 说明 1 Netron 目前的Netron支持主流各种框架的模型结构可视化工作,我直接给出gayhub链接: https://github.com/lutzroeder ...

  6. echart label 不随值变化位置_炼丹神器来了! 模型结构、训练日志、特征提取都能可视化,调参不慌了!...

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 开发者在炼丹的过程中会不会遇到这些问题呢?比如说深度学习模型训练过程中盯 Log 盯得头晕眼花 ...

  7. 可视化caffe模型结构及在线可视化

    在线可视化caffe模型结构 http://ethereon.github.io/netscope/#/editor 假设Caffe的目录是$(CAFFE_ROOT) 1.编译caffe的python ...

  8. lstm处理时序数据结构图_LSTM原理与实践,原来如此简单

    LSTM原理与实践,原来如此简单 首发于公众号:机器学习荐货情报局 做干货最多的公众号,关注了不吃亏原创不易,转载请标明出处 目录 一.介绍 1.1 LSTM介绍 LSTM全称Long Short-T ...

  9. PyTorch 打印模型结构、输出维度和参数信息(torchsummary)

    使用 PyTorch 深度学习搭建模型后,如果想查看模型结构,可以直接使用 print(model) 函数打印.但该输出结果不是特别直观,查阅发现有个能输出类似 keras 风格 model.summ ...

最新文章

  1. mysql ES 同步中间件
  2. 如何用python画数据图-用Python绘制地理图
  3. 我在神策做研发丨做冲在前方的第一方队,造中国最好的开源 SDK
  4. 离开时请告诉自己生意就是生意
  5. 江苏师范大学计算机全国排名,国内131所二本师范大学最新排名(按录取分数线)...
  6. 有关l2,1范数作用的理解--正则化项作用,不同于l1范数(矩阵元素绝对值之和)的稀疏要求,l21范数还要求行稀疏
  7. Python常用小技巧(二)——打开图片
  8. Anroid View事件响应机制和ViewGroup的事件响应分发机制
  9. python判断大小写的函数_python用函数怎么判断大小写
  10. java windows linux 乱码_Linux 中 Windows 中文乱码
  11. java高级教程pdf_《Java高级编程实用教程》PDF 下载_IT教程网
  12. UVa11137 - Ingenuous Cubrency
  13. 端游体验服服务器维护怎么办,经典区高清天堂体验服维护公告
  14. 天琊 V1.0(测试 1125版)
  15. go beego在apache服务器上域名配置 --小丑
  16. 怎么把html表格转化为excel,导出html到excel表格数据格式-如何将html转换成excel
  17. 清浅时光,岁月静好——我的2016
  18. 使用Cookie记住多个登录账号!
  19. 用sklearn.preprocessing做数据预处理(四)——OneHotEncoder
  20. 欧陆风云3实用修改代码

热门文章

  1. 外部电流感应放大器与集成式板载放大器用于电流感应时的比较
  2. dilidili 终于挂了
  3. IE8下@font-face引入特殊字体兼容问题(format|?#iefix|两个url三问)
  4. Variational AutoEncoder(VAE)变分自编码器
  5. 百度地图升级7:mapV的引用 - 曲线加流动动画
  6. 【每日论文阅读】Collaborative Visual Inertial SLAM for Multiple Smart Phones
  7. vue与微信开放标签,调起app
  8. 在GitHub上下载项目文件
  9. Geek Talk 035:阿拉伯国家的创业环境和机会
  10. 实验三 LZW编解码算法实现与分析