双向RNN(LSTM)的实现参考:
https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/bidirectional_rnn.py
需要注意的是,里面的static_bidirectional_rnn()函数是来自tf.contrib.rnn的,它的输入必须是list类型,而最新的官方接口可以直接使用tensor输入

关于基本的LSTM

构建一个rnn需要有两个关键东西,
cell,就是LSTM里面的一个模块;
网络,tf.nn.dynamic_rnn()、tf.nn.static_bidirectional_rnn()等

上面两个网络最后一般返回两个变量,一个是outputs,一个是state
1.
state是一个tuple(默认情况下),内容是(c,h),看LSTM的公式就知道,c就是细胞状态,h就是当前的输出
所以假设输入是[batch_size,steps,dim],中间4个门的神经元个数都是m,
那么c和h的shape都是[batch_size,dim,m],即没有steps这个维度,因为state是当前的最新状态,即经过steps步计算后的最终的状态
2.
outputs的shape是[batch_size,steps,dim,m]
outputs也是最终的输出,它包含了所有steps(视频的话理解为所有帧)的最终的输出

结论:
所以outputs[:,-1,:,:]的数值和state里h的数值是一样的
因为h就是最后step(最后帧)的最终输出

关于双向LSTM

原理可以参考:双向长短时记忆循环神经网络详解(Bi-directional LSTM RNN)

相关文献:《Bidirectional Recurrent Neural Networks》

在tensorflow的官方接口中,相关接口是tf.nn.static_bidirectional_rnn()
需要定义两个cell,分别用于序列的前向传播和后向传播
与一般的LSTM不同,该函数最后的输出有三个变量,outputs,state_fw,state_bw,每个变量的含义差不多和上面所述的一样
不一样的是,state_fw表示前向传播的最终状态,state_bw表示后向传播的最终状态
更要注意的是outputs,它表示的是所有steps(所有帧)的最终输出,但是这个输出是fw和bw相互concat的结果(一般的话,如上所述只有fw)

因此假设一般的LSTM比如tf.nn.dynamic_rnn()的outputs的shape是[batch_size,steps,dim,m],
那么tf.nn.static_bidirectional_rnn()的outputs的shape就是[steps,batch_size,dim*2,m](注意,是list类型),
知道Bidirectional Recurrent Neural Networks的原理就能理解,最后的输出是前向和后向输出的concat。

看tensorflow源代码也知道:
  flat_outputs = tuple(
      array_ops.concat([fw, bw], 1)
      for fw, bw in zip(flat_output_fw, flat_output_bw))
因此,outputs[:][:,0:dim]对应的是fw
outputs[:][:,dim:dim*2]对应的是bw
(注意,这里outputs是list类型,所以用[][]来分开索引)

由于fw和bw反向,因此state_fw的h对应的是outputs[-1][:,0:dim,:](最后一帧)
state_bw的h对应的是outputs[0][:,dim:dim*2,:](第一帧)

附上我的一些实验结果(我用的是convolution LSTM,而且是变长的序列),所以数据的shape会有些不一样

output:

state_fw(state_fw[1]就是前向的h,对应outputs[10][:,0:64]):

state_bw(state_bw[1]就是后向的h,对应outputs[0][:,64:128]):

以上3个是网络的输出。

下面进一步观察outputs里面的数据,

output[0]在axis=1维度上的切分:

output[10]在axis=1维度上的切分:

可见,结果是正确的。

tensorflow中对lstm及双向lstm的理解相关推荐

  1. 使用Keras进行深度学习:(六)LSTM和双向LSTM讲解及实践

    ###欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 长短期记忆(Long Short Term Memor ...

  2. LSTM和双向LSTM讲解及实践

    目录: RNN的长期依赖问题 LSTM原理讲解 双向LSTM原理讲解 keras实现LSTM和双向LSTM RNN 的长期依赖问题 在上篇文章中介绍的循环神经网络RNN在训练的过程中会有长期依赖的问题 ...

  3. PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注

    PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...

  4. 单向LSTM与双向LSTM对比

    一个简单的DEMO:实现手写数字图片的识别 单向LSTM 利用的数据集是tensorflow提供的一个手写数字数据集.该数据集是一个包含55000张28*28的数据集. 训练100次 识别准确率还不是 ...

  5. LSTM和双向LSTM

    文章目录 1. RNN 2. LSTM 2.1 简介 2.2 细胞状态 2.3 遗忘门 2.4 输入门 2.5 输出门 3. 双向LSTM(Bi-directional LSTM) 4. keras ...

  6. 基于Pytorch实现LSTM(多层LSTM,双向LSTM)进行文本分类

    LSTM原理请看这:点击进入 LSTM: nn.LSTM(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=True, ba ...

  7. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载...

    http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...

  8. Tensorflow 使用Bidirectional()包装器构建双向LSTM模型,预测DNA序列功能

    循环神经网络(RNN) 循环神经网络RNN能处理时间序列,过去几年中,应用 RNN 在语音识别,语言建模,翻译,图片描述等问题上已经取得一定成功,并且这个列表还在增长.RNN模型的一个代表是LSTM ...

  9. 利用Keras开发用于分类问题的双向LSTM及与LSTM性能的比较

    双向LSTM是传统LSTM的扩展,可以提高序列分类问题的模型性能.在输入序列为时间问题的分类数据上,双向LSTM在输入序列上训练的模型是两个而不是一个LSTM.输入序列中的第一个是原始样本,第二个是输 ...

最新文章

  1. Android判断软键盘弹出并隐藏的简单完美解决方案
  2. python输出二进制数_二进制中1的个数(python)
  3. android button自定义样式详解,Android自定义格式显示Button的布局思路
  4. DS汽车通过采用沉浸式虚拟现实技术实现展厅转型
  5. .NET开发框架(五)-IIS上部署ASP.NET Core项目教程
  6. Nginx笔记-使用Nginx给vue应用设置一个代理
  7. 使用PLupload在同一页面中进行多个不同类型上传解决方案和一次多文件上传的注意事项...
  8. linux make 无法生成 .o gch,Linux--makefile的使用
  9. mysql优化的基本原则和方向
  10. 对无焦点窗口模拟按键_键盘不为人知的一面——单按键篇
  11. 2016美国QCon思考:通过Quora和Spotify案例,直击数据处理背后的魅影
  12. php url伪静态,PHP url伪静态
  13. Gazebo烧脑系列:挑战赛
  14. 为什么我总抢注不到域名?
  15. 展望99股市:谁是重组大黑马?(转)
  16. 卡贴机被“全面封杀”?苹果关闭有锁iPhone的ICCID激活服务
  17. java bitwise_Java Core.bitwise_and方法代码示例
  18. 关于Python将plt文件坐标转换为TXT文本
  19. 《豪杰音乐工作室》技巧拾遗
  20. [CTF]2022美团CTF WEB WP

热门文章

  1. linux 命令 -history 查看历史执行过的命令
  2. 一个refine/refactor的例子
  3. 图片无损压缩 图片无损等比例缩放
  4. 安装 Black Duck
  5. Java农历(阴历)工具类
  6. 麻将牌技法--收藏慢慢学
  7. c# 去掉字符串最后一个逗号
  8. [Arcpy] 0 Arcpy初识 | Arcpy开发思路
  9. 面向对象类和类之间的几种关系
  10. 人际沟通中的亲密关系