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

原文地址:https://www.cnblogs.com/bbird/p/9937938.html

时间: 2024-10-18 12:38:33

简单的RNN和BP多层网络之间的区别的相关文章

深度学习原理与框架-递归神经网络-RNN网络基本框架(代码?) 1.rnn.LSTMCell(生成单层LSTM) 2.rnn.DropoutWrapper(对rnn进行dropout操作) 3.tf.contrib.rnn.MultiRNNCell(堆叠多层LSTM) 4.mlstm_cell.zero_state(state初始化) 5.mlstm_cell(进行LSTM求解)

问题:LSTM的输出值output和state是否是一样的 1. rnn.LSTMCell(num_hidden, reuse=tf.get_variable_scope().reuse)  # 构建单层的LSTM网络 参数说明:num_hidden表示隐藏层的个数,reuse表示LSTM的参数进行复用 2.rnn.DropoutWrapper(cell, output_keep_prob=keep_prob) # 表示对rnn的输出层进行dropout 参数说明:cell表示单层的lstm,o

简单谈谈Resource,Drawable和Bitmap之间的转换

一直接触这些东西,还是归个类整理一下比较好. Resource -> Drawable Drawable draw1 = this.getResources().getDrawable(R.drawable.icon); Drawable -> Bitmap 1. static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIntrinsicWidth();/

解密:Ble低功耗蓝牙和蓝牙mesh网络之间的关系

如今蓝牙mesh组网从推出到现在近一年时间了,蓝牙mesh组网的优势让众多方案商趋之若鹜.今天来普及下Ble低功耗蓝牙和蓝牙mesh网络之间的关系! 一.低功耗蓝牙和蓝牙mesh的关系: 蓝牙mesh并非无线通信技术,而是一种网络技术.蓝牙mesh网络依赖于低功耗蓝牙.低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈. 低功耗蓝牙设备可以设置成广播模式,以无连接方式进行工作,其广播的数据,位于广播范围内的任何其他蓝牙主机设备都可接收.这是"一对多"(1:N)的拓扑,其中N可以是一个非常

servlet与Javabean之间的区别

在JSP中调用JAVA类和使用JavaBean有什么区别? 可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类.特殊在可以通过<jsp:useBean/>调用JavaBean而其他类,可以和一般java中一样使用.  Bean的参数中还可以指定范围, <jsp:useBean   scope="application"   />该Bean在服务器的JVM中将只有一个实例. Bean是和WebServer相关的,不同的页面可以通过Bean 交互.

VMWare虚拟机bridged、host-only和NAT网络模式的区别和用法

VMWare提供了三种工作模式,它们是bridged(bridged 模式).NAT( 网络地址转换模式)和host-only(主机模式) . 1  VMWare虚拟机bridged.host-only和NAT网络模式的区别 1.1 bridged(桥接模式) 在bridged 模式下, VMWare 虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在bridged模式下,你需要手工为虚拟系统配置I P 地址.子网掩码, 而且还要和宿主机器处于同一网段, 这样虚拟系

TCP中close和shutdown之间的区别

该图片截取自<<IP高效编程-改善网络编程的44个技巧>>,第17个技巧. 如果想验证可以写个简单的网络程序,分别用close和shutdown来断开连接,然后用tcpdump查看交互过程,就一目了然了.本来我想自己写个程序验证,但是自己笔记本上没有linux环境,公司环境又不能通外网,所以就放弃了. TCP中close和shutdown之间的区别,布布扣,bubuko.com

TCP和UDP之间的区别

TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端. UDP---用户数据报协议,是一个简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地.由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快. 现

UTF-8和GBK编码之间的区别(页面编码、数据库编码区别)以及在实际项目中的应用

第一节:UTF-8和GBK编码概述 UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码,它包含全世界所有国家需要用到的字符,是国际编码,通用性强,是用以解决国际上字符的一种多字节编码.由Ken Thompson于1992年创建.UTF-8用1到4个字节编码UNICODE字符,它对英文使用8位/8Bit(即1个字节/1Byte),中文使用24位/24Bit(3个字节/3Byte)来编码.用在网页上可以同一页

你知道URL、URI和URN三者之间的区别吗

这是一个经典的技术争论,许多人都会自问:URL.URI,很可能还有URN,它们之间的区别是什么.虽然,现在我们简单地把 URN 和 URL 都看做 URI,但严格来说URI可以进一步划分为URL.URN或者这两者的组合,所以了解这三者之间的区别将会非常有趣并让人受益匪浅.如果你恰好在某个地方碰到了这些东西,那么至少应该知道它们的含义. 我认为,尽管对一般人来说,不了解这三个缩略词之间的技术差异以及它们各自的含义并不是什么问题.但是,如果你作为一个计算机科学家.一个Web开发者.一个系统管理员,或