LSTM神经网络全称长短时记忆神经网络(Long Short-term Memory),是一种特殊的RNN(Recurrent Neural Network)。下面从一下几个部分对LSTM进行介绍。

  • LSTM–cell、gate的基本概念
  • LSTM内部结构
  • 基于Tensorflow的LSTM实现代码解析
  • LSTM推断在FPGA实现思路

1. 基本概念

1.1 cell

Cell是构成RNN神经网络的基本单元,Cell能够记忆之前输入的状态。LSTM是RNN的一种变种,解决了RNN在训练过程中梯度爆炸和梯度消失的问题。在LSTM中保持了Cell的概念,但与RNN不同的是,LSTM中Cell记忆的是两种状态:1)记忆之前输入的状态c(Tensorflow中称c-state);2)当前输出状态h(Tensorflow中称m-state)。

cell结构图

LSTM的输入是按照时间序列分步进行输入,在每个时间步(Timestep)cell都进行状态更新。在t时刻,cell的记忆状态

表示Cell记忆t-1以及以前时刻的输入状态,
表示t-1时刻Cell的输出。于是当多个Cell逻辑连接在一起时,就组成了一个完整的LSTM推断过程,如下图。在一轮LSTM推断中,LSTM输入序列为
,Timestep=t。此时LSTM输出为
,然后输入新的序列进行下一轮的推断。
LSTM推断过程图

1.2 门

门(Gate)是将LSTM与RNN区分开来的一个重要概念,cell更新状态靠的是门。在cell中,有三个门:遗忘门(Forget Gate),输入门(Input Gate)和输出门(Output Gate)。门的作用是控制数据范围,接下来会围绕下面三个问题对门和cell结构进行解释,1)门的输入数据是什么;2)门的输出数据是什么;3)门控制谁的数据范围。

1)门的输入数据是什么?

门的输入数据是前一个时刻cell的输出

和当前的输入

2)门的输出数据是什么?

门的输入数据乘以权值矩阵,然后经过激活函数,即为门的输出,门输出的数据范围与激活函数的类型有关。用函数表示:

是激活函数,常用sigmoid函数,
表示门的输入数据,
表示权值和偏置(与神经元中的概念是一致的)。

3)门控制谁的数据范围?

  • 遗忘门:之前的状态

    会对当前cell输出有影响,遗忘门的作用是对之前的状态进行部分遗忘。(过去不开心的事情该忘记的就忘记吧==)
  • 输入门:对当前cell的输入的数据进行控制。(选择性吸收?)
  • 输出门:对当前cell的输出的数据进行控制。(谁还不能留点小秘密..)
Gate结构

2. LSTM结构

LSTM是由cell构成,而cell则是由gate构成。下面来看看gate是怎么构成cell的吧!

好吧...图是我不知道在哪copy的..懒得画了
  • forget gate:

  • input gate :
  • new cell :
  • output gate:

前一个时刻cell的输出和当前时刻序列的输入拼接作为各个门的输入,拼接后乘以不同权值矩阵(加上偏置)可以得到不同的门:遗忘门、输入门和输出门。上一时刻cell的记忆状态与遗忘门做element-wise(对应元素相乘),表示遗忘之前时刻的部分信息;输入门与new cell做element-wise,表示加入当前时刻的部分信息;经过遗忘和加入新的记忆,得到cell新的记忆状态。最后与输出门做element-wise,将cell部分信息作为cell的输出。

3. 代码实现

github上有比较好的基于tensorflow实现lstm的例子,对其中部分代码做一些说明和拓展。

lstm​github.com

lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
1) n_hidden: 表示Cell中h的维度
2) lstm_cell.weights[0]: 获取lstm内部权值, 按照i,j,f,o顺序
3) lstm_cell.weights[1]: 获取偏置outputs, states = tf.contrib.rnn.static_rnn(lstm_cell, x, dtype=tf.float32,sequence_length=seqlen)
1) outputs: 每个timestep输出一组outputs, 分别表示每个时间步Cell的输出h
2) states: 分为s-state和m-state, 分别表示最后一个时间步Cell的c和h第一步解析:
1. c = np.array(10*[0])
2. x1 = np.array(test_data[0,0])
3. h1 = np.array(10*[0])
4. xh1 = np.append(x1,h1,axis=0)
5. concat = np.dot(xh1,lstm_kernel) + lstm_bias
6. i, j, f, o = np.split(concat,4)
7. new_c = (c*sigmoid(f + 1.0) + sigmoid(i)*mytanh(j))
8. new_h = (mytanh(new_c)*sigmoid(o))第一步解析说明:
1-3:Cell初始状态输入
4:[x,h]
5-6:计算隔各个门,得到i,j,f,o(j是new cell)
7-8:Cell更新c,h

4. FPGA实现

加速计算一般是加速推断部分,而训练是在CPU/GPU中进行。将各个权值数据范围弄清楚,设计各个模块就比较简单了。这里记录一下主要模块,在FPGA中实现推断部分需要的计算模块:矩阵计算、存储控制、cell结构。

  • 矩阵计算:在乘法器资源充足的条件下,可以采用并行方式计算,先计算向量相乘再累加,然后进行模块例化,实现矩阵计算。
  • Cell结构:实现单个cell逻辑,激活函数采用分段非线性逼近,激活函数的处理对最终精度有很大影响。
  • 存储控制:控制矩阵计算和cell运算的数据流。
lstm实现结构

需要注意的点:

  • 在仿真时需要弄清权值的数据范围,以及各个输入、输出和中间变量的数据范围,对进行数据定点化处理,确定数据位宽。
  • 为了降低延时,可以将数据处理速率提升至数据输入速率的n倍(需要计算每次运算需要多少个时钟)。

lstm结构图_神经网络——单层LSTM相关推荐

  1. lstm处理时序数据结构图_详解LSTM

    Recurrent Neural Networks (RNN) 在使用深度学习处理时序问题时,RNN是最常使用的模型之一.RNN之所以在时序数据上有着优异的表现是因为RNN在 时间片时会将 时间片的隐 ...

  2. 循环神经网络_漫谈循环神经网络:LSTM、GRU

    知乎视频​www.zhihu.com 简单循环神经网络的局限性 循环神经网络横向结构也是借助激活函数进行传递的: 上图是循环神经网络按时间步展开,而如果一次处理的时间步过长,即从左到右的层数很深,那么 ...

  3. lstm结构图_LSTM模型结构的可视化

    目录: 1.传统的BP网络和CNN网络 2.LSTM网络 3.LSTM的输入结构 4.pytorch中的LSTM 4.1 pytorch中定义的LSTM模型 4.2 喂给LSTM的数据格式 4.3 L ...

  4. 基于双向 lstm 和残差神经网络的 rna 二级结构预测方法

    目录 结果 结论 背景 结果 学习结果和演示 预测结果和比较 讨论 结论 材料和方法 数据收集和处理 摘要 背景: 研究表明,rna 二级结构是由配对碱基构成的平面结构,在基本生命活动和复杂疾病中发挥 ...

  5. lstm结构图_ON-LSTM:能表示语言层次的LSTM

    序列模型不完美,拥有层次才更佳 LSTM作为序列模型一直是自然语言处理的最佳选择之一,即使transformer出现了也依然无法撼动LSTM在NLP界的江湖地位. 然而,语言虽然看起来是一个序列,实际 ...

  6. python3语音识别模块_语音识别(LSTM+CTC)

    序言:语音识别作为人工智能领域重要研究方向,近几年发展迅猛,其中RNN的贡献尤为突出.RNN设计的目的就是让神经网络可以处理序列化的数据.本文笔者将陪同小伙伴们一块儿踏上语音识别之梦幻旅途,相信此处风 ...

  7. bagging和时间序列预测_时间序列的LSTM模型预测——基于Keras

    一.问题背景     现实生活中,在一系列时间点上观测数据是司空见惯的活动,在农业.商业.气象军事和医疗等研究领域都包含大量的时间序列数据.时间序列的预测指的是基于序列的历史数据,以及可能对结果产生影 ...

  8. tensor flow lstm 图像 一条直线_深入理解LSTM

    LSTM Author:louwill From:深度学习笔记 原始结构的RNN还不够处理较为复杂的序列建模问题,它存在较为严重的梯度消失问题,最直观的现象就是随着网络层数增加,网络会逐渐变得无法训练 ...

  9. 循环神经网络之LSTM、GRU

    循环神经网络之LSTM.GRU 1. 什么是 LSTM? LSTM(Long short-term memory,长短期记忆)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题 ...

最新文章

  1. 世界上根本没有正确的选择
  2. codeforces gym-101741 Subsequence Sum Queries 分治+离线
  3. Java并发编程实战————售票问题
  4. zabbix java api
  5. python小工具自动审单录凭证_跟着老板工作了二十年,最近来了个新员工然后我被开除了...
  6. 铁路从未授权任何第三方平台售票服务,各大旅游网站哪来的接口?
  7. jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
  8. 关于RecyclerView(一)基本使用
  9. 加了2个皮肤的art dialog
  10. Java写的一个二叉树三种遍历递归算法(仅用作理解三种遍历)
  11. 有学问,还是牛逼啊!
  12. 陈纪修老师《数学分析》 第08章:反常积分 笔记
  13. 基于Java毕业设计移动电商网站源码+系统+mysql+lw文档+部署软件
  14. 电气元件知识大全:实物图、作用、型号分类、工作原理、符号都有
  15. 使用FlashPaper在线转换.doc为.swf
  16. 洛阳九县八取名字_洛阳市地图(洛阳市九县六区地图)
  17. 使用mysql管理系统建表时,字段中有PK,NN,UQ,BIN,UN,ZF,AI基本字段类型标识的意义
  18. 寻找两个正序数组的中位数
  19. 修改改EXCEL页眉页脚
  20. pixhawk 学习笔记

热门文章

  1. 用神经网络分类陀螺和遥远星体
  2. php 自定义文件后缀,自定义更改服务器asp/php/.net等文件后缀名
  3. bsc是指什么_掌握BSC,实现企业数字化管理
  4. 2021/6/18~19 每天学习python 30分钟 -了解python - python的基本变量概述
  5. 4、C语言面试笔试--内存操作-指针
  6. 功率增长步长(powerRampingStep)
  7. ubuntu10.10各种服务器搭建
  8. 【PC工具】N个直播录屏相关软件,手机投屏电脑,电脑显示手机摄像头图像,必须好用无广告!...
  9. AgileEAS.NET平台视频会议培训第二辑-简单插件开发应用演练(速度下载)
  10. 简单算法题:leetcode-2 两数相加