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

 更新时间:2020-01-26 11:00:53   作者:佚名   我要评论(0)

双向RNN:bidirectional_dynamic_rnn()函数的使用详解
先说下为什么要使用到双向RNN,在读一篇文章的时候,上文提到的信息十分的重要,但这些信息是不足以捕捉文章信

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

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

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

上图是一个双向LSTM的结构图,对于最后输出的每个隐藏状态 都是前向网络和后向网络的元组,即 其中每一个 或者 又是一个由隐藏状态和细胞状态组成的元组(或者是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()函数的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • TensorFlow实现RNN循环神经网络
  • Pytorch实现基于CharRNN的文本分类与生成示例
  • 浅谈Tensorflow 动态双向RNN的输出问题

相关文章

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

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

    双向RNN:bidirectional_dynamic_rnn()函数的使用详解 先说下为什么要使用到双向RNN,在读一篇文章的时候,上文提到的信息十分的重要,但这些信息是不足以捕捉文章信
    2020-01-26
  • 关于tf.nn.dynamic_rnn返回值详解

    关于tf.nn.dynamic_rnn返回值详解

    函数原型 tf.nn.dynamic_rnn( cell, inputs, sequence_length=None, initial_state=None, dtype=None, parallel_iterations=None, swap_memory=Fal
    2020-01-26
  • python机器学习库xgboost的使用

    python机器学习库xgboost的使用

    1.数据读取 利用原生xgboost库读取libsvm数据 import xgboost as xgb data = xgb.DMatrix(libsvm文件) 使用sklearn读取libsvm数据 from sklearn.
    2020-01-26
  • 浅谈Tensorflow 动态双向RNN的输出问题

    浅谈Tensorflow 动态双向RNN的输出问题

    tf.nn.bidirectional_dynamic_rnn() 函数: def bidirectional_dynamic_rnn( cell_fw, # 前向RNN cell_bw, # 后向RNN inputs, # 输入 sequence_length=No
    2020-01-26
  • python爬取本站电子书信息并入库的实现代码

    python爬取本站电子书信息并入库的实现代码

    入门级爬虫:只抓取书籍名称,信息及下载地址并存储到数据库 数据库工具类:DBUtil.py import pymysql class DBUtils(object): def connDB(self):
    2020-01-26
  • TFRecord格式存储数据与队列读取实例

    TFRecord格式存储数据与队列读取实例

    Tensor Flow官方网站上提供三种读取数据的方法 1. 预加载数据:在Tensor Flow图中定义常量或变量来保存所有数据,将数据直接嵌到数据图中,当训练数据较大时,很消耗
    2020-01-26
  • 使用 tf.nn.dynamic_rnn 展开时间维度方式

    使用 tf.nn.dynamic_rnn 展开时间维度方式

    对于单个的 RNNCell , 使用色的 call 函数进行运算时 ,只是在序列时间上前进了一步 。 如使用 x1、 ho 得到此h1, 通过 x2 、 h1 得到 h2 等 。 tf.nn.dynamic_r
    2020-01-26
  • tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例

    tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例

    ckpt from tensorflow.python import pywrap_tensorflow checkpoint_path = 'model.ckpt-8000' reader = pywrap_tensorflow.NewCheckpointReader(checkpoint_pa
    2020-01-26
  • tensorflow模型继续训练 fineturn实例

    tensorflow模型继续训练 fineturn实例

    解决tensoflow如何在已训练模型上继续训练fineturn的问题。 训练代码 任务描述: x = 3.0, y = 100.0, 运算公式 x×W+b = y,求 W和b的最优解。 # -*- coding: u
    2020-01-26
  • Python实现FLV视频拼接功能

    Python实现FLV视频拼接功能

    文章摘要 本文简单说明了FLV文件的格式,以此为出发点,使用 Python 实现FLV视频的拼接。 一.FLV文件格式 关于FLV文件格式的解析网上有诸多文章,在这里就简单介绍一
    2020-01-26

最新评论