上期我们一起学习了RNN中输入输出任性的组合方式 深度学习三人行(第14期)----RNN输入输出的组合有多任性 原理学习了两期,今天我们一起看下在tensorflow中基本的RNN是怎么实现的。
首先,为了更好的理解RNN的运行机制,我们不用tensorflow的相关RNN的操作,来实现一个简单的RNN模型。这里我们创建一个 深度学习三人行(第13期)----初识循环神经网络(RNN) 中所呈现的一个拥有5个循环神经元的一层RNN网络,其中激活函数用tanh,并且假设该RNN仅运行两个时刻,每个时刻的输入向量的大小为3,通过两个时刻来显示。代码如下:
代码语言:javascript复制n_inputs = 3
n_neurons = 5
X0 = tf.placeholder(tf.float32, [None, n_inputs])
X1 = tf.placeholder(tf.float32, [None, n_inputs])
Wx = tf.Variable(tf.random_normal(shape=[n_inputs, n_neurons],dtype=tf.float32))
Wy = tf.Variable(tf.random_normal(shape=[n_neurons,n_neurons],dtype=tf.float32))
b = tf.Variable(tf.zeros([1, n_neurons], dtype=tf.float32))
Y0 = tf.tanh(tf.matmul(X0, Wx) b)
Y1 = tf.tanh(tf.matmul(Y0, Wy) tf.matmul(X1, Wx) b)
init = tf.global_variables_initializer()
这个网络有点绕,咋一看像两层向前传输的网络,其实不然,首先,相同的权重和偏置项都被两个层采用了。其次,在每一层都有输入,并且每一层都有单独的输出。为了运行这个模型,我们需要在两个时刻都对模型进行输入数据,如下:
代码语言:javascript复制import numpy as np
# Mini-batch: instance 0,instance 1,instance 2,instance 3
X0_batch = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]]) # t = 0
X1_batch = np.array([[9, 8, 7], [0, 0, 0], [6, 5, 4], [3, 2, 1]]) # t = 1
with tf.Session() as sess:
init.run()
Y0_val, Y1_val = sess.run([Y0, Y1], feed_dict={X0: X0_batch, X1: X1_batch})
上面的mini-batch包含了两个时刻的输入,每个时刻有4个样本,其中每个样本包含3个特征。最后的Y0_val和Y1_val包括了两个时刻的网络所有神经元在mini-batch上的输出。 下面是输出的结果:
代码语言:javascript复制>>> print(Y0_val) # output at t = 0
[[-0.2964572 0.82874775 -0.34216955 -0.75720584 0.19011548] # instance 0
[-0.12842922 0.99981797 0.84704727 -0.99570125 0.38665548] # instance 1
[ 0.04731077 0.99999976 0.99330056 -0.999933 0.55339795] # instance 2
[ 0.70323634 0.99309105 0.99909431 -0.85363263 0.7472108 ]] # instance 3
>>> print(Y1_val) # output at t = 1
[[ 0.51955646 1. 0.99999022 -0.99984968 -0.24616946] # instance 0
[-0.70553327 -0.11918639 0.48885304 0.08917919 -0.26579669] # instance 1
[-0.32477224 0.99996376 0.99933046 -0.99711186 0.10981458] # instance 2
[-0.43738723 0.91517633 0.97817528 -0.91763324 0.11047263]] # instance 3
其实在理解了前两期的内容之后,就会发现这不难,但是当我们要在100个时间点上运行一个RNN的话,这个图将会变得非常大。
下一期,我们将一起学习下如何运用tensorflow的RNN操作来创建RNN网络。