zoukankan      html  css  js  c++  java
  • 简单的RNN和BP多层网络之间的区别

    先来个简单的多层网络

    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的类库去描绘,不是太利于理解底层的东西。所以我选择了用这种写法去表述。不对之处请多多指教。

  • 相关阅读:
    LeetCode Array Easy 414. Third Maximum Number
    LeetCode Linked List Medium 2. Add Two Numbers
    LeetCode Array Easy 283. Move Zeroes
    LeetCode Array Easy 268. Missing Number
    LeetCode Array Easy 219. Contains Duplicate II
    LeetCode Array Easy 217. Contains Duplicate
    LeetCode Array Easy 189. Rotate Array
    LeetCode Array Easy169. Majority Element
    LeetCode Array Medium 11. Container With Most Water
    LeetCode Array Easy 167. Two Sum II
  • 原文地址:https://www.cnblogs.com/bbird/p/9937938.html
Copyright © 2011-2022 走看看