循环神经网络,rnn python实现

  循环神经网络,rnn python实现

  本文主要介绍python递归神经网络of tf.nn.dynamic _ rnn of的使用实例。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010 TF . nn . dynamic _ rnn学习定义介绍;tf.nn.dynamic_rnn的使用示例;单层实验;多层实验

  

目录

  RNN网络的建设已经完成,但是我们对RNN网络还有很多疑问,尤其是tf.nn.dynamic_rnn函数。我们不熟悉它的具体应用模式。查阅资料后,我的想法如下。

  

学习前言

  tf.nn.dynamic_rnn(

  细胞,

  输入,

  sequence _ length=无,

  初始状态=无,

  dtype=无,

  parallel _ iterations=无

  swap_memory=False,

  time_major=False,

  范围=无

  )

  Cell:上面定义的lstm_cell。投入:RNN投入。如果time_major==false(默认),则必须是以下形状的张量:[batch _ size,max_time,]或此类元素的嵌套元组。如果time_major==true,那么它必须是一个具有以下形状的张量:[max _ time,batch_size,…]或者是这类元素的嵌套元组。Sequence _ length: int32/int64向量大小。用于在超出批元素的序列长度时复制传递状态和零输出。因此,它更多的是关于性能而不是正确性。Initial_state:上面定义的_init_state。数据类型。Parallel_iterations:并行运行的迭代次数。那些没有任何时间依赖性并且可以并行运行的操作将被。这个参数用时间换空间。值1使用更多的内存但花费更少的时间,而较小的值使用更少的内存但花费更长的时间来计算。Time_major:输入输出张量的形状格式。如果为真,这些张量的形状必须是[max_time,batch_size,depth]。如果为False,这些张量的形状必须是[batch_size,max_time,depth]。使用time_major=true更有效,因为它可以避免RNN计算开始和结束时的换位。但是大部分TensorFlow数据都是批量主数据,所以这个函数默认是假的。Scope:创建的子图的变量作用域;默认为“RNN”。返回值是输出、状态。

  输出:RNN最后一层的输出是一个张量。如果time_major==False,其形状为[batch _ size,max _ time,cell.output _ size]。如果time_major==True,其形状为[max _ time,batch _ size,cell.output _ size]。

  状态:是每一层最后一步的输出,是一个张量。状态是最终状态,即序列中最后一个单元输出的状态。一般状态的形状是[batch_size,cell.output_size],但当输入单元格是BasicLSTMCell时,状态的形状是[2,batch_size,cell.output_size],其中2也对应LSTM中的单元格状态和隐藏状态。

  

tf.nn.dynamic_rnn的定义

  

tf.nn.dynamic_rnn的使用举例

  首先,我们使用单层RNN进行实验。

  使用的代码是:

  将张量流作为tf导入

  将numpy作为np导入

  N_steps=2 #两步

  N_inputs=3 #每个输入

  是三维

  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的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: