浅谈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获取apk文件URL地址实例
Nov 01 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
Python中使用dom模块生成XML文件示例
Apr 05 Python
Python字符串格式化输出方法分析
Apr 13 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
python实现输入数字的连续加减方法
Jun 22 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
python向字符串中添加元素的实例方法
Jun 28 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
详解python的异常捕获
Mar 03 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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实现的九九乘法口诀表简洁版
2014/07/28 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
定义select的边框颜色
2008/04/28 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
js数组去重的hash方法
2016/12/22 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python类的用法实例浅析
2015/05/27 Python
Python的装饰器使用详解
2017/06/26 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
Python如何操作docker redis过程解析
2020/08/10 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
代办委托书怎么写
2014/08/01 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
2015年领班工作总结
2015/04/29 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书