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

  • 相关阅读:
    [Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子
    [Spark][Python][DataFrame][RDD]从DataFrame得到RDD的例子
    [Spark][Python][DataFrame][Write]DataFrame写入的例子
    机器视觉:SSD Single Shot MultiBox Detector
    python中类的创建和实例化
    Gram格拉姆矩阵在风格迁移中的应用
    【证明】【一题多解】【等价转换】—— 排列组合的计算
    【证明】【一题多解】—— 负梯度方向的证明
    keras中VGG19预训练模型的使用
    软件开发 —— 过程资产与交付件
  • 原文地址:https://www.cnblogs.com/bbird/p/9937938.html
Copyright © 2011-2022 走看看