python循环神经网络RNN函数tf.nn.dynamic_rnn使用
作者:Bubbliiiing 发布时间:2022-08-28 15:42:24
学习前言
已经完成了RNN网络的构建,但是我们对于RNN网络还有许多疑问,特别是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=False,
time_major=False,
scope=None
)
cell:上文所定义的lstm_cell。
inputs:RNN输入。如果time_major==false(默认),则必须是如下shape的tensor:[batch_size,max_time,…]或此类元素的嵌套元组。如果time_major==true,则必须是如下形状的tensor:[max_time,batch_size,…]或此类元素的嵌套元组。
sequence_length:Int32/Int64矢量大小。用于在超过批处理元素的序列长度时复制通过状态和零输出。因此,它更多的是为了性能而不是正确性。
initial_state:上文所定义的_init_state。
dtype:数据类型。
parallel_iterations:并行运行的迭代次数。那些不具有任何时间依赖性并且可以并行运行的操作将是。这个参数用时间来交换空间。值>>1使用更多的内存,但花费的时间更少,而较小的值使用更少的内存,但计算需要更长的时间。
time_major:输入和输出tensor的形状格式。如果为True,这些张量的形状必须是[max_time,batch_size,depth]。如果为False,这些张量的形状必须是[batch_size,max_time,depth]。使用time_major=true会更有效率,因为它可以避免在RNN计算的开始和结束时进行换位。但是,大多数TensorFlow数据都是批处理主数据,因此默认情况下,此函数为False。
scope:创建的子图的可变作用域;默认为“RNN”。
其返回值为outputs,states。
outputs
:RNN的最后一层的输出,是一个tensor。如果为time_major== False,则它的shape为[batch_size,max_time,cell.output_size]。如果为time_major== True,则它的shape为[max_time,batch_size,cell.output_size]。
states
:是每一层的最后一个step的输出,是一个tensor。state是最终的状态,也就是序列中最后一个cell输出的状态。一般情况下states的形状为 [batch_size, cell.output_size],但当输入的cell为BasicLSTMCell时,states的形状为[2,batch_size, cell.output_size ],其中2也对应着LSTM中的cell state和hidden state。
tf.nn.dynamic_rnn的使用举例
单层实验
我们首先使用单层的RNN进行实验。
使用的代码为:
import tensorflow as tf
import numpy as np
n_steps = 2 #两个step
n_inputs = 3 #每个input是三维
n_nerve = 4 #神经元个数
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_nerve)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
X_batch = np.array([[[0, 1, 2], [1, 2, 3]],
[[3, 4, 5], [4, 5, 6]],
[[5, 6, 7], [6, 7, 8]],
[[7, 8, 9], [8, 9, 10]]])
with tf.Session() as sess:
sess.run(init)
outputs_val, states_val = sess.run([outputs, states], feed_dict={X: X_batch})
print("outputs:", outputs_val)
print("states:", states_val)
输出的log为:
outputs: [[[0.92146313 0.6069534 0.24989243 0.9305415 ]
[0.9234855 0.8470011 0.7865616 0.99935764]]
[[0.9772771 0.9713368 0.99483156 0.9999987 ]
[0.9753329 0.99538314 0.9988139 1. ]]
[[0.9901842 0.99558043 0.9998626 1. ]
[0.989398 0.9992842 0.9999691 1. ]]
[[0.99577546 0.9993256 0.99999636 1. ]
[0.9954579 0.9998903 0.99999917 1. ]]]
states: [[0.9234855 0.8470011 0.7865616 0.99935764]
[0.9753329 0.99538314 0.9988139 1. ]
[0.989398 0.9992842 0.9999691 1. ]
[0.9954579 0.9998903 0.99999917 1. ]]
Xin的shape是[batch_size = 4, max_time = 2, depth = 3]。
outputs的shape是[batch_size = 4, max_time = 2, cell.output_size = 4]。
states的shape是[batch_size = 4, cell.output_size = 4]
在time_major = False的时候:
Xin、outputs、states的第一维,都是batch_size,即用于训练的batch的大小。
Xin、outputs的第二维,都是max_time,在本文中对应着RNN的两个step。
outputs、states的最后一维指的是每一个RNN的Cell的输出,本文的RNN的Cell的n_nerve为4,所以cell.output_size = 4。Xin的最后一维指的是每一个输入样本的维度。
outputs对应的是RNN的最后一层的输出,states对应的是每一层的最后一个step的输出。在RNN的层数仅1层的时候,states的输出对应为outputs最后的step的输出。
多层实验
接下来我们使用两层的RNN进行实验。
使用的代码为:
import tensorflow as tf
import numpy as np
n_steps = 2 #两个step
n_inputs = 3 #每个input是三维
n_nerve = 4 #神经元个数
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
#定义多层
layers = [tf.nn.rnn_cell.BasicRNNCell(num_units=n_nerve) for i in range(2)]
multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
X_batch = np.array([[[0, 1, 2], [1, 2, 3]],
[[3, 4, 5], [4, 5, 6]],
[[5, 6, 7], [6, 7, 8]],
[[7, 8, 9], [8, 9, 10]]])
with tf.Session() as sess:
sess.run(init)
outputs_val, states_val = sess.run([outputs, states], feed_dict={X: X_batch})
print("outputs:", outputs_val)
print("states:", states_val)
输出的log为:
outputs: [[[-0.577939 -0.3657474 -0.21074213 0.8188577 ]
[-0.67090076 -0.47001836 -0.40080917 0.6026697 ]]
[[-0.72777444 -0.36500326 -0.7526911 0.86113644]
[-0.7928404 -0.6413429 -0.61007065 0.787065 ]]
[[-0.7537433 -0.35850585 -0.83090436 0.8573037 ]
[-0.82016116 -0.6559162 -0.7360482 0.7915131 ]]
[[-0.7597004 -0.35760364 -0.8450942 0.8567379 ]
[-0.8276395 -0.6573326 -0.7727142 0.7895221 ]]]
states: (array([[-0.71645427, -0.0585744 , 0.95318353, 0.8424729 ],
[-0.99845 , -0.5044571 , 0.9955299 , 0.9750488 ],
[-0.99992913, -0.8408632 , 0.99885863, 0.9932366 ],
[-0.99999577, -0.9672 , 0.9996866 , 0.99814796]],
dtype=float32),
array([[-0.67090076, -0.47001836, -0.40080917, 0.6026697 ],
[-0.7928404 , -0.6413429 , -0.61007065, 0.787065 ],
[-0.82016116, -0.6559162 , -0.7360482 , 0.7915131 ],
[-0.8276395 , -0.6573326 , -0.7727142 , 0.7895221 ]],
dtype=float32))
可以看出来outputs对应的是RNN的最后一层的输出,states对应的是每一层的最后一个step的输出,在完成了两层的定义后,outputs的shape并没有变化,而states的内容多了一层,分别对应RNN的两层输出。
state中最后一层输出对应着outputs最后一步的输出。
来源:https://blog.csdn.net/weixin_44791964/article/details/98480738


猜你喜欢
- function commafy() { var num = document.getElementById("NumA"
- 本文实例讲述了Python3.6日志Logging模块简单用法。分享给大家供大家参考,具体如下:Logging是一个很方便的模块,用来打印日
- 本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下代码:from turtle import *#控制彩虹路径d
- Pandas库十分强大,但是对于切片操作iloc, loc和ix,很多人对此十分迷惑,因此本篇博客利用例子来说明这3者之一的区别和联系,尤其
- 段正淳的css笔记(1)分类之间的横竖线:试想过总结出这几年来写css与xhtml的经验 ,汇总成一片”旷世奇文”分享给大家。无奈寡人年世已
- MySQL去重的方法整理【初级】有极少的重复行使用distinct查出来,然后手动一行一行删除。【中级】按照单个字段的重复去重例如:对id字
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- 本文实例讲述了Python正则表达式实现简易计算器功能。分享给大家供大家参考,具体如下:需求:使用正则表达式完成一个简易计算器。功能:能够计
- 引言在负责咨询工作的过去 6 年中,我曾多次听说关于数据访问和操作方面的问题,它时刻困扰着用户:“如何编写应用程序,以便
- jqueryjQueryJQUERYJqueryJQueryjquery报错jsJSJsmyeclipseMyEclipseMyeclips
- asp网站程序在国内运用很广,但是类似于im286.asp?id=20050307213811这样的url有点不利于搜索引擎的收录,也就是说
- 项目中有个定时任务,每天取到一些表数据传到一个外部接口,但是最近总是有异常,今天查了下原因。首先本地和测试环境测试这个程序都没问题,只有线上
- struts2.3.24 + spring4.1.6 + hibernate4.3.11+ mysql5.5.25开发环境搭建及相关说明。
- 一、前言一个Sql Server 开发智能提示插件,方便查询表结果,避免了开发人员一个个敲查询语句、执行语句等,一起来看看吧。SQL Pro
- 本文实例讲述了javascript 使用sleep函数的常见方法。分享给大家供大家参考,具体如下:一.什么是sleep函数?花一点时间来聊一
- 本文实例为大家分享了python批量下载抖音视频的具体代码,供大家参考,具体内容如下知识储备:博主是在Pycharm下进行的 文件夹:dou
- 最近在查看asp之家的访客统计时,发现访客使用firefox浏览器的占了10%-15%,而大部分的访客使用的是IE6,呵呵我也是用IE6。而
- 1.新建三个html文件,两个php文件和若干个CSS文件和若干个JS文件2.登录的html页面显示效果图3.注册的页面的显示效果图4.登录
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作⚠️ 腐蚀膨胀概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今
- 安装pymysqlpip install pymysql2|0使用pymysql2|1使用数据查询语句查询一条数据fetchone()fro