双向RNN:bidirectional_dynamic_rnn()函数的使用详解


Posted in Python onJanuary 20, 2020

双向RNN:bidirectional_dynamic_rnn()函数的使用详解

先说下为什么要使用到双向RNN,在读一篇文章的时候,上文提到的信息十分的重要,但这些信息是不足以捕捉文章信息的,下文隐含的信息同样会对该时刻的语义产生影响。

举一个不太恰当的例子,某次工作会议上,领导进行“简洁地”总结,他会在第一句告诉你:“下面,为了节约时间,我简单地说两点…”,(…此处略去五百字…),“首先,….”,(…此处略去一万字…),“碍于时间的关系,我要加快速度了,下面我简要说下第二点…”(…此处再次略去五千字…)“好的,我想说的大概就是这些”(…此处又略去了二百字…),“谢谢大家!”如果将这篇发言交给一个单层的RNN网络去学习,因为“首先”和“第二点”中间隔得实在太久,等到开始学习“第二点”时,网络已经忘记了“简单地说两点”这个重要的信息,最终的结果就只剩下在风中凌乱了。。。于是我们决定加一个反向的网络,从后开始往前听,对于这层网络,他首先听到的就是“第二点”,然后是“首先”,最后,他对比了一下果然仅仅是“简要地两点”,在于前向的网络进行结合,就深入学习了领导的指导精神。

双向RNN:bidirectional_dynamic_rnn()函数的使用详解

上图是一个双向LSTM的结构图,对于最后输出的每个隐藏状态双向RNN:bidirectional_dynamic_rnn()函数的使用详解 都是前向网络和后向网络的元组,即双向RNN:bidirectional_dynamic_rnn()函数的使用详解 其中每一个双向RNN:bidirectional_dynamic_rnn()函数的使用详解 或者双向RNN:bidirectional_dynamic_rnn()函数的使用详解 又是一个由隐藏状态和细胞状态组成的元组(或者是concat)。同样最终的output也是需要将前向和后向的输出concat起来的,这样就保证了在最终时刻,无论是输出还是隐藏状态都是有考虑了上文和下文信息的。

下面就来看下tensorflow中已经集成的 tf.nn.bidirectional_dynamic_rnn() 函数。似乎双向的暂时只有这一个动态的RNN方法,不过想想也能理解,这种结构暂时也只会在encoder端出现,无论你的输入是pad到了定长或者是不定长的,动态RNN都是可以处理的。

具体的定义如下:

tf.nn.bidirectional_dynamic_rnn(
 cell_fw,
 cell_bw,
 inputs,
 sequence_length=None,
 initial_state_fw=None,
 initial_state_bw=None,
 dtype=None,
 parallel_iterations=None,
 swap_memory=False,
 time_major=False,
 scope=None
)

仔细看这个方法似乎和dynamic_rnn()没有太大区别,无非是多加了一个bw的部分,事实上也的确如此。先看下前向传播的部分:

with vs.variable_scope(scope or "bidirectional_rnn"):
 # Forward direction
 with vs.variable_scope("fw") as fw_scope:
  output_fw, output_state_fw = dynamic_rnn(
    cell=cell_fw, inputs=inputs, 
    sequence_length=sequence_length,
    initial_state=initial_state_fw, 
    dtype=dtype,
    parallel_iterations=parallel_iterations, 
    swap_memory=swap_memory,
    scope=fw_scope)

完全就是一个dynamic_rnn(),至于你选择LSTM或者GRU,只是cell的定义不同罢了。而双向RNN的核心就在于反向的bw部分。刚才说过,反向部分就是从后往前读,而这个翻转的部分,就要用到一个reverse_sequence()的方法,来看一下这一部分:

with vs.variable_scope("bw") as bw_scope:
 # ———————————— 此处是重点 ———————————— 
 inputs_reverse = _reverse(
   inputs, seq_lengths=sequence_length,
   seq_dim=time_dim, batch_dim=batch_dim)
 # ————————————————————————————————————
 tmp, output_state_bw = dynamic_rnn(
   cell=cell_bw, 
   inputs=inputs_reverse, 
   sequence_length=sequence_length,
   initial_state=initial_state_bw, 
   dtype=dtype,
   parallel_iterations=parallel_iterations,
   swap_memory=swap_memory,
   time_major=time_major, 
   scope=bw_scope)

我们可以看到,这里的输入不再是inputs,而是一个inputs_reverse,根据time_major的取值,time_dim和batch_dim组合的 {0,1} 取值正好相反,也就对应了时间维和批量维的词序关系。

而最终的输出:

outputs = (output_fw, output_bw)
output_states = (output_state_fw, output_state_bw)

这里还有最后的一个小问题,output_states是一个元组的元组,我个人的处理方法是用c_fw,h_fw = output_state_fw和c_bw,h_bw = output_state_bw,最后再分别将c和h状态concat起来,用tf.contrib.rnn.LSTMStateTuple()函数生成decoder端的初始状态。

以上这篇双向RNN:bidirectional_dynamic_rnn()函数的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Twisted框架编写简单的网络客户端
Apr 16 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
Python自定义线程类简单示例
Mar 23 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
python实现的登录与提交表单数据功能示例
Sep 25 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 Python
关于tf.reverse_sequence()简述
Jan 20 #Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 #Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 #Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 #Python
python机器学习库xgboost的使用
Jan 20 #Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 #Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 #Python
You might like
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php递归实现无限分类的方法
2015/07/28 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
8个必备的PHP功能开发
2015/10/02 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python实现滑雪游戏
2020/02/22 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
python 实现批量图片识别并翻译
2020/11/02 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
机电专业毕业生推荐信
2013/11/10 职场文书
2014年元旦感言
2014/03/06 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
小学大队委竞选口号
2015/12/25 职场文书