双向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设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
理解python中生成器用法
Dec 20 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
django中的数据库迁移的实现
Mar 16 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
Nov 17 Python
Python实现位图分割的效果
Nov 20 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
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
Python新手实现2048小游戏
2015/03/31 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
5款非常棒的Python工具
2018/01/05 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
实习自我鉴定
2013/12/15 职场文书
农场厂长岗位职责
2013/12/28 职场文书
五心教育心得体会
2014/09/04 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
中国合伙人观后感
2015/06/02 职场文书
对学校的意见和建议
2015/06/04 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android