先来个简单的多层网络

RNN的原理和出现的原因,解决什么场景的什么问题

关于RNN出现的原因,RNN详细的原理,已经有很多博文讲解的非常棒了。
如下:


http://ai.51cto.com/art/201711/559441.htm


更多的例子可以百度了解

为什么我写这篇博客

主要是我从自己学习理解RNN的时候,开始有一些困难,书上讲的也是模模糊糊的,原理讲解的很多,但是代码的关键点描述不太清楚,自己反复揣测以后,终于有了一些理解,记录下来,一方面记录自己的成长过程,另外一方面可以让跟我一样有疑惑的同学可以少走弯路,当然也有可能是错路。

多层网络
x = tf.placeholder(tf.float32,[None,256])
y = tf.placeholder(tf.float32,[None,10])

w1 = tf.Variable(tf.random_normal([256,1024]))
b1 = tf.Variable(tf.zeros([1024]))

x1 = tf.nn.relu(tf.multiply(w1,x)+b1)

w2 = tf.Variable(tf.random_normal(1024,10))
b2 = tf.Variable(tf.zeros([10]))
pred = tf.nn.softmax(tf.multiply(w2,x1)+b2)
loss = -tf.reduce_sum(pred*tf.log(y))
op = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

在写个简单的RNN网络

import tensorflow as tf

# RNN
batch_size = 5
truncated_series_length = 50000
state_size = 4

x = tf.placeholder(tf.float32,[batch_size,truncated_series_length])
y = tf.placeholder(tf.float32,[batch_size,truncated_series_length])

'''
最关键的点,好多书上没写的,就是这个参数,是参与循环的参数
BP网络中没有这个参数
'''
init_state = tf.placeholder(tf.float32,[batch_size,state_size])

# 把X,Y拆开,我的理解是为了方便看得到循环的时候State是如何参与循环的
xs = tf.unstack(x,axis=1)
ys = tf.unstack(y,axis=1)
current_state = init_state

for currentx,currenty in zip(xs,ys):
    
    w1 = tf.Variable(tf.random_normal([truncated_series_length+ state_size,truncated_series_length]))
    b1 = tf.Variable(tf.zeros([truncated_series_length]))
    #这个就是和BP的区别,把循环链接起来
    concatedx = tf.concat(xs,current_state)
    y1 = tf.nn.tanh(tf.multiply(w1,x) + b1)

    #区别
    current_state = y1
    #注释掉这一层,让看上去更容易理解为什么叫做循环网络
    #w2= tf.Variable(tf.random_normal([truncated_series_length,truncated_series_length]))
    #b2 = tf.Variable(tf.zeros([truncated_series_length]))
    #y2 = tf.multiply(w2,y1)+b2

    loss = -tf.reduce_sum(y1*tf.log(currenty))

个人感觉两个的主要区别在于BP网络中每个参数每一步都是独立的,和下一个样本之间不相互依赖,而RNN有一个参数参与循环。另外RNN的一些参数的设置,我还不是太熟悉,还有待于深入。另外很多书上讲解Rnn用的是tf.contrib.layers或tf.contrib.cnn的类库去描绘,不是太利于理解底层的东西。所以我选择了用这种写法去表述。不对之处请多多指教。

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!