经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
简单的RNN和BP多层网络之间的区别
来源:cnblogs  作者:bbird2018  时间:2018/11/10 1:47:15  对本文有异议

先来个简单的多层网络

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

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


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


更多的例子可以百度了解

为什么我写这篇博客

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

  1. 多层网络
  2. x = tf.placeholder(tf.float32,[None,256])
  3. y = tf.placeholder(tf.float32,[None,10])
  4. w1 = tf.Variable(tf.random_normal([256,1024]))
  5. b1 = tf.Variable(tf.zeros([1024]))
  6. x1 = tf.nn.relu(tf.multiply(w1,x)+b1)
  7. w2 = tf.Variable(tf.random_normal(1024,10))
  8. b2 = tf.Variable(tf.zeros([10]))
  9. pred = tf.nn.softmax(tf.multiply(w2,x1)+b2)
  10. loss = -tf.reduce_sum(pred*tf.log(y))
  11. op = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

在写个简单的RNN网络

  1. import tensorflow as tf
  2. # RNN
  3. batch_size = 5
  4. truncated_series_length = 50000
  5. state_size = 4
  6. x = tf.placeholder(tf.float32,[batch_size,truncated_series_length])
  7. y = tf.placeholder(tf.float32,[batch_size,truncated_series_length])
  8. '''
  9. 最关键的点,好多书上没写的,就是这个参数,是参与循环的参数
  10. BP网络中没有这个参数
  11. '''
  12. init_state = tf.placeholder(tf.float32,[batch_size,state_size])
  13. # 把X,Y拆开,我的理解是为了方便看得到循环的时候State是如何参与循环的
  14. xs = tf.unstack(x,axis=1)
  15. ys = tf.unstack(y,axis=1)
  16. current_state = init_state
  17. for currentx,currenty in zip(xs,ys):
  18. w1 = tf.Variable(tf.random_normal([truncated_series_length+ state_size,truncated_series_length]))
  19. b1 = tf.Variable(tf.zeros([truncated_series_length]))
  20. #这个就是和BP的区别,把循环链接起来
  21. concatedx = tf.concat(xs,current_state)
  22. y1 = tf.nn.tanh(tf.multiply(w1,x) + b1)
  23. #区别
  24. current_state = y1
  25. w2= tf.Variable(tf.random_normal([truncated_series_length,truncated_series_length]))
  26. b2 = tf.Variable(tf.zeros([truncated_series_length]))
  27. y2 = tf.multiply(w2,y1)+b2
  28. loss = -tf.reduce_sum(y2*tf.log(currenty))

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号