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


Posted in Python onJanuary 20, 2020

tf.nn.bidirectional_dynamic_rnn()

函数:

def bidirectional_dynamic_rnn(
  cell_fw, # 前向RNN
  cell_bw, # 后向RNN
  inputs, # 输入
  sequence_length=None,# 输入序列的实际长度(可选,默认为输入序列的最大长度)
  initial_state_fw=None, # 前向的初始化状态(可选)
  initial_state_bw=None, # 后向的初始化状态(可选)
  dtype=None, # 初始化和输出的数据类型(可选)
  parallel_iterations=None,
  swap_memory=False,
  time_major=False,
  # 决定了输入输出tensor的格式:如果为true, 向量的形状必须为 `[max_time, batch_size, depth]`.
  # 如果为false, tensor的形状必须为`[batch_size, max_time, depth]`.
  scope=None
)

其中,

outputs为(output_fw, output_bw),是一个包含前向cell输出tensor和后向cell输出tensor组成的元组。假设

time_major=false,tensor的shape为[batch_size, max_time, depth]。实验中使用tf.concat(outputs, 2)将其拼接。

output_states为(output_state_fw, output_state_bw),包含了前向和后向最后的隐藏状态的组成的元组。

output_state_fw和output_state_bw的类型为LSTMStateTuple。

LSTMStateTuple由(c,h)组成,分别代表memory cell和hidden state。

返回值:

元组:(outputs, output_states)

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

def encoding_layer(rnn_size,sequence_length,num_layers,rnn_inputs,keep_prob):
  # rnn_size: rnn隐层节点数量
  # sequence_length: 数据的序列长度
  # num_layers:堆叠的rnn cell数量
  # rnn_inputs: 输入tensor
  # keep_prob:
  '''Create the encoding layer'''
  for layer in range(num_layers):
    with tf.variable_scope('encode_{}'.format(layer)):
      cell_fw = tf.contrib.rnn.LSTMCell(rnn_size,initializer=tf.random_uniform_initializer(-0.1,0.1,seed=2))
      cell_fw = tf.contrib.rnn.DropoutWrapper(cell_fw,input_keep_prob=keep_prob)
 
      cell_bw = tf.contrib.rnn.LSTMCell(rnn_size,initializer=tf.random_uniform_initializer(-0.1,0.1,seed=2))
      cell_bw = tf.contrib.rnn.DropoutWrapper(cell_bw,input_keep_prob = keep_prob)
 
      enc_output,enc_state = tf.nn.bidirectional_dynamic_rnn(cell_fw,cell_bw,
                                  rnn_inputs,sequence_length,dtype=tf.float32)
 
  # join outputs since we are using a bidirectional RNN
  enc_output = tf.concat(enc_output,2) 
  return enc_output,enc_state

tf.nn.dynamic_rnn()

tf.nn.dynamic_rnn的返回值有两个:outputs和state

为了描述输出的形状,先介绍几个变量,batch_size是输入的这批数据的数量,max_time就是这批数据中序列的最长长度,如果输入的三个句子,那max_time对应的就是最长句子的单词数量,cell.output_size其实就是rnn cell中神经元的个数。

例子来说明其用法,假设你的RNN的输入input是[2,20,128],其中2是batch_size,20是文本最大长度,128是embedding_size,可以看出,有两个example,我们假设第二个文本长度只有13,剩下的7个是使用0-padding方法填充的。dynamic返回的是两个参数:outputs,state,其中outputs是[2,20,128],也就是每一个迭代隐状态的输出,state是由(c,h)组成的tuple,均为[batch,128]。

outputs. outputs是一个tensor

如果time_major==True,outputs形状为 [max_time, batch_size, cell.output_size ](要求rnn输入与rnn输出形状保持一致)

如果time_major==False(默认),outputs形状为 [ batch_size, max_time, cell.output_size ]

state. state是一个tensor。state是最终的状态,也就是序列中最后一个cell输出的状态。一般情况下state的形状为 [batch_size, cell.output_size ],但当输入的cell为BasicLSTMCell时,state的形状为[2,batch_size, cell.output_size ],其中2也对应着LSTM中的cell state和hidden state。

这里有关于LSTM的结构问题:

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

以上这篇浅谈Tensorflow 动态双向RNN的输出问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现linux下使用xcopy的方法
Jun 28 Python
Python编程实现的图片识别功能示例
Aug 03 Python
windows 下python+numpy安装实用教程
Dec 23 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
Apache部署Django项目图文详解
Jul 30 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
python中使用input()函数获取用户输入值方式
May 03 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
关于tf.nn.dynamic_rnn返回值详解
Jan 20 #Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 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
You might like
php json_encode值中大括号与花括号区别
2013/09/30 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
vue按需加载实例详解
2019/09/06 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
python http基本验证方法
2018/12/26 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
劳动模范事迹材料
2014/01/19 职场文书
安全标语口号
2014/06/09 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
销售员岗位职责范本
2015/04/11 职场文书
党支部半年考察意见
2015/06/01 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书