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


Posted in Python onJanuary 20, 2020

函数原型

tf.nn.dynamic_rnn(
  cell,
  inputs,
  sequence_length=None,
  initial_state=None,
  dtype=None,
  parallel_iterations=None,
  swap_memory=False,
  time_major=False,
  scope=None
)

实例讲解:

import tensorflow as tf
import numpy as np
 
n_steps = 2
n_inputs = 3
n_neurons = 5
 
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
 
seq_length = tf.placeholder(tf.int32, [None])
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32,
                  sequence_length=seq_length)
 
init = tf.global_variables_initializer()
 
X_batch = np.array([
    # step 0   step 1
    [[0, 1, 2], [9, 8, 7]], # instance 1
    [[3, 4, 5], [0, 0, 0]], # instance 2 (padded with zero vectors)
    [[6, 7, 8], [6, 5, 4]], # instance 3
    [[9, 0, 1], [3, 2, 1]], # instance 4
  ])
seq_length_batch = np.array([2, 1, 2, 2])
 
with tf.Session() as sess:
  init.run()
  outputs_val, states_val = sess.run(
    [outputs, states], feed_dict={X: X_batch, seq_length: seq_length_batch})
  print("outputs_val.shape:", outputs_val.shape, "states_val.shape:", states_val.shape)
  print("outputs_val:", outputs_val, "states_val:", states_val)

log info:

outputs_val.shape: (4, 2, 5) states_val.shape: (4, 5)
outputs_val: 
[[[ 0.53073734 -0.61281306 -0.5437517  0.7320347 -0.6109526 ]
 [ 0.99996936 0.99990636 -0.9867181  0.99726075 -0.99999976]]
 
 [[ 0.9931584  0.5877845 -0.9100412  0.988892  -0.9982337 ]
 [ 0.     0.     0.     0.     0.    ]]
 
 [[ 0.99992317 0.96815354 -0.985101  0.9995968 -0.9999936 ]
 [ 0.99948144 0.9998127 -0.57493806 0.91015154 -0.99998355]]
 
 [[ 0.99999255 0.9998929  0.26732785 0.36024097 -0.99991137]
 [ 0.98875254 0.9922327  0.6505734  0.4732064 -0.9957567 ]]] 
states_val:
 [[ 0.99996936 0.99990636 -0.9867181  0.99726075 -0.99999976]
 [ 0.9931584  0.5877845 -0.9100412  0.988892  -0.9982337 ]
 [ 0.99948144 0.9998127 -0.57493806 0.91015154 -0.99998355]
 [ 0.98875254 0.9922327  0.6505734  0.4732064 -0.9957567 ]]

首先输入X是一个 [batch_size,step,input_size] = [4,2,3] 的tensor,注意我们这里调用的是BasicRNNCell,只有一层循环网络,outputs是最后一层每个step的输出,它的结构是[batch_size,step,n_neurons] = [4,2,5],states是每一层的最后那个step的输出,由于本例中,我们的循环网络只有一个隐藏层,所以它就代表这一层的最后那个step的输出,因此它和step的大小是没有关系的,我们的X有4个样本组成,输出神经元大小n_neurons是5,因此states的结构就是[batch_size,n_neurons] = [4,5],最后我们观察数据,states的每条数据正好就是outputs的最后一个step的输出。

下面我们继续讲解多个隐藏层的情况,这里是三个隐藏层,注意我们这里仍然是调用BasicRNNCell

import tensorflow as tf
import numpy as np
 
n_steps = 2
n_inputs = 3
n_neurons = 5
n_layers = 3
 
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
seq_length = tf.placeholder(tf.int32, [None])
 
layers = [tf.contrib.rnn.BasicRNNCell(num_units=n_neurons,
                   activation=tf.nn.relu)
     for layer in range(n_layers)]
multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32, sequence_length=seq_length)
 
init = tf.global_variables_initializer()
 
X_batch = np.array([
    # step 0   step 1
    [[0, 1, 2], [9, 8, 7]], # instance 1
    [[3, 4, 5], [0, 0, 0]], # instance 2 (padded with zero vectors)
    [[6, 7, 8], [6, 5, 4]], # instance 3
    [[9, 0, 1], [3, 2, 1]], # instance 4
  ])
 
seq_length_batch = np.array([2, 1, 2, 2])
 
with tf.Session() as sess:
  init.run()
  outputs_val, states_val = sess.run(
    [outputs, states], feed_dict={X: X_batch, seq_length: seq_length_batch})
  print("outputs_val.shape:", outputs, "states_val.shape:", states)
  print("outputs_val:", outputs_val, "states_val:", states_val)

log info:

outputs_val.shape: 
Tensor("rnn/transpose_1:0", shape=(?, 2, 5), dtype=float32) 
 
states_val.shape: 
(<tf.Tensor 'rnn/while/Exit_3:0' shape=(?, 5) dtype=float32>, 
 <tf.Tensor 'rnn/while/Exit_4:0' shape=(?, 5) dtype=float32>, 
 <tf.Tensor 'rnn/while/Exit_5:0' shape=(?, 5) dtype=float32>)
 
outputs_val:
 [[[0.     0.     0.     0.     0.    ]
 [0.     0.18740742 0.     0.2997518 0.    ]]
 
 [[0.     0.07222144 0.     0.11551574 0.    ]
 [0.     0.     0.     0.     0.    ]]
 
 [[0.     0.13463384 0.     0.21534224 0.    ]
 [0.03702604 0.18443246 0.     0.34539366 0.    ]]
 
 [[0.     0.54511094 0.     0.8718864 0.    ]
 [0.5382122 0.     0.04396425 0.4040263 0.    ]]] 
 
states_val:
 (array([[0.    , 0.83723307, 0.    , 0.    , 2.8518028 ],
    [0.    , 0.1996038 , 0.    , 0.    , 1.5456247 ],
    [0.    , 1.1372368 , 0.    , 0.    , 0.832613 ],
    [0.    , 0.7904129 , 2.4675028 , 0.    , 0.36980057]],
   dtype=float32), 
 array([[0.6524607 , 0.    , 0.    , 0.    , 0.    ],
    [0.25143963, 0.    , 0.    , 0.    , 0.    ],
    [0.5010576 , 0.    , 0.    , 0.    , 0.    ],
    [0.    , 0.3166597 , 0.4545995 , 0.    , 0.    ]],
   dtype=float32), 
 array([[0.    , 0.18740742, 0.    , 0.2997518 , 0.    ],
    [0.    , 0.07222144, 0.    , 0.11551574, 0.    ],
    [0.03702604, 0.18443246, 0.    , 0.34539366, 0.    ],
    [0.5382122 , 0.    , 0.04396425, 0.4040263 , 0.    ]],
   dtype=float32))

我们说过,outputs是最后一层的输出,即 [batch_size,step,n_neurons] = [4,2,5]

states是每一层的最后一个step的输出,即三个结构为 [batch_size,n_neurons] = [4,5] 的tensor

继续观察数据,states中的最后一个array,正好是outputs的最后那个step的输出

下面我们继续讲当由BasicLSTMCell构造单元工厂的时候,只讲多层的情况,我们只需要将上面的BasicRNNCell替换成BasicLSTMCell就行了,打印信息如下:

outputs_val.shape: 
Tensor("rnn/transpose_1:0", shape=(?, 2, 5), dtype=float32) 
 
states_val.shape:
(LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_3:0' shape=(?, 5) dtype=float32>, 
        h=<tf.Tensor 'rnn/while/Exit_4:0' shape=(?, 5) dtype=float32>), 
LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_5:0' shape=(?, 5) dtype=float32>, 
        h=<tf.Tensor 'rnn/while/Exit_6:0' shape=(?, 5) dtype=float32>), 
LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_7:0' shape=(?, 5) dtype=float32>, 
        h=<tf.Tensor 'rnn/while/Exit_8:0' shape=(?, 5) dtype=float32>))
 
outputs_val: 
[[[1.2949290e-04 0.0000000e+00 2.7623639e-04 0.0000000e+00 0.0000000e+00]
 [9.4675866e-05 0.0000000e+00 2.0214770e-04 0.0000000e+00 0.0000000e+00]]
 
 [[4.3100454e-06 4.2123037e-07 1.4312843e-06 0.0000000e+00 0.0000000e+00]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]]
 
 [[0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]]
 
 [[0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00]]] 
 
states_val: 
(LSTMStateTuple(
c=array([[0.    , 0.    , 0.04676079, 0.04284539, 0.    ],
    [0.    , 0.    , 0.0115245 , 0.    , 0.    ],
    [0.    , 0.    , 0.    , 0.    , 0.    ],
    [0.    , 0.    , 0.    , 0.    , 0.    ]],
   dtype=float32), 
h=array([[0.    , 0.    , 0.00035096, 0.04284406, 0.    ],
    [0.    , 0.    , 0.00142574, 0.    , 0.    ],
    [0.    , 0.    , 0.    , 0.    , 0.    ],
    [0.    , 0.    , 0.    , 0.    , 0.    ]],
   dtype=float32)), 
LSTMStateTuple(
c=array([[0.0000000e+00, 1.0477135e-02, 4.9871090e-03, 8.2785974e-04,
    0.0000000e+00],
    [0.0000000e+00, 2.3306280e-04, 0.0000000e+00, 9.9445322e-05,
    5.9535629e-05],
    [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
    0.0000000e+00],
    [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
    0.0000000e+00]], dtype=float32), 
h=array([[0.00000000e+00, 5.23016974e-03, 2.47756205e-03, 4.11730434e-04,
    0.00000000e+00],
    [0.00000000e+00, 1.16522635e-04, 0.00000000e+00, 4.97301044e-05,
    2.97713632e-05],
    [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
    0.00000000e+00],
    [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
    0.00000000e+00]], dtype=float32)), 
LSTMStateTuple(
c=array([[1.8937115e-04, 0.0000000e+00, 4.0442235e-04, 0.0000000e+00,
    0.0000000e+00],
    [8.6200516e-06, 8.4243663e-07, 2.8625946e-06, 0.0000000e+00,
    0.0000000e+00],
    [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
    0.0000000e+00],
    [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
    0.0000000e+00]], dtype=float32), 
h=array([[9.4675866e-05, 0.0000000e+00, 2.0214770e-04, 0.0000000e+00,
    0.0000000e+00],
    [4.3100454e-06, 4.2123037e-07, 1.4312843e-06, 0.0000000e+00,
    0.0000000e+00],
    [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
    0.0000000e+00],
    [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
    0.0000000e+00]], dtype=float32)))

我们先看看LSTM单元的结构

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

如果您不查看框内的内容,LSTM单元看起来与常规单元格完全相同,除了它的状态分为两个向量:h(t)和c(t)。你可以将h(t)视为短期状态,将c(t)视为长期状态。

因此我们的states包含三个LSTMStateTuple,每一个表示每一层的最后一个step的输出,这个输出有两个信息,一个是h表示短期记忆信息,一个是c表示长期记忆信息。维度都是[batch_size,n_neurons] = [4,5],states的最后一个LSTMStateTuple中的h就是outputs的最后一个step的输出

以上这篇关于tf.nn.dynamic_rnn返回值详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python MD5文件生成码
Jan 12 Python
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
python实现随机密码字典生成器示例
Apr 09 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
Python找出最小的K个数实例代码
Jan 04 Python
简单谈谈python中的lambda表达式
Jan 19 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
python实现信号时域统计特征提取代码
Feb 26 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
Python中全局变量和局部变量的理解与区别
Feb 07 Python
pandas 按日期范围筛选数据的实现
Feb 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
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 #Python
You might like
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
php include和require的区别深入解析
2013/06/17 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Python实现批量下载图片的方法
2015/07/08 Python
详解Python循环作用域与闭包
2019/03/21 Python
python web框架中实现原生分页
2019/09/08 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
python如何从键盘获取输入实例
2020/06/18 Python
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
中学教师自我鉴定
2014/02/07 职场文书
主题党日活动总结
2014/07/08 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
三潭印月的导游词
2015/02/12 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫