python循环神经网络RNN函数tf.nn.dynamic_rnn使用

目录
  • 学习前言
  • tf.nn.dynamic_rnn的定义
  • tf.nn.dynamic_rnn的使用举例
    • 单层实验
    • 多层实验

学习前言

已经完成了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
)
  1. cell:上文所定义的lstm_cell。
  2. inputs:RNN输入。如果time_major==false(默认),则必须是如下shape的tensor:[batch_size,max_time,…]或此类元素的嵌套元组。如果time_major==true,则必须是如下形状的tensor:[max_time,batch_size,…]或此类元素的嵌套元组。
  3. sequence_length:Int32/Int64矢量大小。用于在超过批处理元素的序列长度时复制通过状态和零输出。因此,它更多的是为了性能而不是正确性。
  4. initial_state:上文所定义的_init_state。
  5. dtype:数据类型。
  6. parallel_iterations:并行运行的迭代次数。那些不具有任何时间依赖性并且可以并行运行的操作将是。这个参数用时间来交换空间。值>>1使用更多的内存,但花费的时间更少,而较小的值使用更少的内存,但计算需要更长的时间。
  7. time_major:输入和输出tensor的形状格式。如果为True,这些张量的形状必须是[max_time,batch_size,depth]。如果为False,这些张量的形状必须是[batch_size,max_time,depth]。使用time_major=true会更有效率,因为它可以避免在RNN计算的开始和结束时进行换位。但是,大多数TensorFlow数据都是批处理主数据,因此默认情况下,此函数为False。
  8. 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最后一步的输出。

以上就是python循环神经网络RNN函数tf.nn.dynamic_rnn使用的详细内容,更多关于RNN函数tf.nn.dynamic_rnn的资料请关注我们其它相关文章!

(0)

相关推荐

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

    双向RNN:bidirectional_dynamic_rnn()函数的使用详解 先说下为什么要使用到双向RNN,在读一篇文章的时候,上文提到的信息十分的重要,但这些信息是不足以捕捉文章信息的,下文隐含的信息同样会对该时刻的语义产生影响. 举一个不太恰当的例子,某次工作会议上,领导进行"简洁地"总结,他会在第一句告诉你:"下面,为了节约时间,我简单地说两点-",(-此处略去五百字-),"首先,-.",(-此处略去一万字-),"碍于时间的

  • python人工智能tensorflow构建循环神经网络RNN

    目录 学习前言 RNN简介 tensorflow中RNN的相关函数 tf.nn.rnn_cell.BasicLSTMCell tf.nn.dynamic_rnn 全部代码 学习前言 在前一段时间已经完成了卷积神经网络的复习,现在要对循环神经网络的结构进行更深层次的明确. RNN简介 RNN 是当前发展非常火热的神经网络中的一种,它擅长对序列数据进行处理. 什么是序列数据呢?举个例子. 现在假设有四个字,“我” “去” “吃” “饭”.我们可以对它们进行任意的排列组合. “我去吃饭”,表示的就是我

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

    对于单个的 RNNCell , 使用色的 call 函数进行运算时 ,只是在序列时间上前进了一步 . 如使用 x1. ho 得到此h1, 通过 x2 . h1 得到 h2 等 . tf.nn.dynamic_rnn的作用: 如果序列长度为n,要调用n次call函数,比较麻烦.对此,TensorFlow提供了一个tf.nn.dynamic_mn函数,使用该函数相当于调用了n次call函数.通过{ho, x1 , x2,-, xn} 直接得到{h1 , h2,-, hn} . 具体来说,设输入数据的

  • 关于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 ) 实例讲解: import tensorflow as tf import numpy as np n_steps = 2 n_inputs = 3 n_neuron

  • python循环神经网络RNN函数tf.nn.dynamic_rnn使用

    目录 学习前言 tf.nn.dynamic_rnn的定义 tf.nn.dynamic_rnn的使用举例 单层实验 多层实验 学习前言 已经完成了RNN网络的构建,但是我们对于RNN网络还有许多疑问,特别是tf.nn.dynamic_rnn函数,其具体的应用方式我们并不熟悉,查询了一下资料,我心里的想法是这样的. tf.nn.dynamic_rnn的定义 tf.nn.dynamic_rnn( cell, inputs, sequence_length=None, initial_state=Non

  • python人工智能tensorflow函数tf.nn.dropout使用方法

    目录 前言 tf.nn.dropout函数介绍 例子 代码 keep_prob = 0.5 keep_prob = 1 前言 神经网络在设置的神经网络足够复杂的情况下,可以无限逼近一段非线性连续函数,但是如果神经网络设置的足够复杂,将会导致过拟合(overfitting)的出现,就好像下图这样. 看到这个蓝色曲线,我就知道: 很明显蓝色曲线是overfitting的结果,尽管它很好的拟合了每一个点的位置,但是曲线是歪歪曲曲扭扭捏捏的,这个的曲线不具有良好的鲁棒性,在实际工程实验中,我们更希望得到

  • 基于循环神经网络(RNN)的古诗生成器

    基于循环神经网络(RNN)的古诗生成器,具体内容如下 之前在手机百度上看到有个"为你写诗"功能,能够随机生成古诗,当时感觉很酷炫= = 在学习了深度学习后,了解了一下原理,打算自己做个实现练练手,于是,就有了这个项目.文中如有瑕疵纰漏之处,还请路过的诸位大佬不吝赐教,万分感谢! 使用循环神经网络实现的古诗生成器,能够完成古体诗的自动生成.我简单地训练了一下,格式是对上了,至于意境么...emmm,呵呵 举一下模型测试结果例子: 1.生成古体诗 示例1: 树阴飞尽水三依,谩自为能厚景奇.

  • 基于循环神经网络(RNN)实现影评情感分类

    使用循环神经网络(RNN)实现影评情感分类 作为对循环神经网络的实践,我用循环神经网络做了个影评情感的分类,即判断影评的感情色彩是正面的,还是负面的. 选择使用RNN来做情感分类,主要是因为影评是一段文字,是序列的,而RNN对序列的支持比较好,能够"记忆"前文.虽然可以提取特征词向量,然后交给传统机器学习模型或全连接神经网络去做,也能取得很好的效果,但只从端对端的角度来看的话,RNN无疑是最合适的. 以下介绍实现过程. 一.数据预处理 本文中使用的训练数据集为https://www.c

  • Python使用循环神经网络解决文本分类问题的方法详解

    本文实例讲述了Python使用循环神经网络解决文本分类问题的方法.分享给大家供大家参考,具体如下: 1.概念 1.1.循环神经网络 循环神经网络(Recurrent Neural Network, RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络. 卷积网络的输入只有输入数据X,而循环神经网络除了输入数据X之外,每一步的输出会作为下一步的输入,如此循环,并且每一次采用相同的激活函数和参数.在每次循环中,x0乘以系数U得到s0,再经过系数W输入

  • TensorFlow实现RNN循环神经网络

    RNN(recurrent neural Network)循环神经网络 主要用于自然语言处理(nature language processing,NLP) RNN主要用途是处理和预测序列数据 RNN广泛的用于 语音识别.语言模型.机器翻译 RNN的来源就是为了刻画一个序列当前的输出与之前的信息影响后面节点的输出 RNN 是包含循环的网络,允许信息的持久化. RNN会记忆之前的信息,并利用之前的信息影响后面节点的输出. RNN的隐藏层之间的节点是有相连的,隐藏层的输入不仅仅包括输入层的输出,还包

  • python人工智能tensorflow函数tf.layers.dense使用方法

    目录 参数数量及其作用 部分参数解释: 示例 参数数量及其作用 tf.layers.dense用于添加一个全连接层. 函数如下: tf.layers.dense( inputs, #层的输入 units, #该层的输出维度 activation=None, #激活函数 use_bias=True, kernel_initializer=None, # 卷积核的初始化器 bias_initializer=tf.zeros_initializer(), # 偏置项的初始化器 kernel_regul

随机推荐