循环神经网络Rnn小结(简单代码实现mnist数据集)

Rnn 处理序列数据的神经网络

每次RNN 运算完后会产生一个当前状态的描述,Y(t+1)是由S(t)和S(t+1)形成

 

Rnn特征提取

权值共享

(输入X1的状态)=(输入X0状态)+X1

Rnn运行过程

由前到后的序列过程

RNN输入和输出

参照CNN对比,CNN只能1个输入得到1个输出

RNN有1对多,多对1,还有多对多

RNN结构

经典的RNN结构

U,W,b都是同一个值。一个箭头代表一次变换。

h2=f(Ux2+Wh1+b)

.......

以此类推

但是由于是对等输入和输出序列等长,适用范围小

比如charRNN

https://www.jianshu.com/p/50fd465ec1e1

RNN结构N-1

输入一个序列得到一个值

比如:输入一某个文件得到一个结果的情况

RNN 结构1-N

比如:图片生成文字

RNN问题:

梯度消失和梯度爆炸

信息记忆到达最后一个时间点,然后我们得到误差,而且在反向传递,得到误差的时候,

他在每一步都会乘一一个自己参数W,如果这个W是一个小于 1的数,误差传到初始点也会是一个接近于0的数,会梯度弥散。

如果是一个大于1的数,那么就会梯度爆炸。

解决:

LSTM(Long Short-Term Memory):

 

(一)概念

主要是输入门(判断输入值的重要程度),输出门(判断输出值的重要程度)和忘记门(是否忘记信息)

Cell细胞状态类似于传送带,直接在整个链上运行,只有一些少量信息交互。

 

(二)内部解析

在单个cell个体中通过的输出信息主要是通过门来控制。

sigmoid层:输出的每个元素都是一个在0和1之间的实数,表示让对应信息通过的权重。

ht−1:表示的是上一个cell的输出。

xt:表示的是当前细胞的输入。

σ表示sigmod函数。

遗忘门:

决定细胞状态丢失什么信息。这个决定通过遗忘门完成。

读取ht-1和xt输出0到1之间的值给在下一个细胞中的数值,0表示完全舍弃,1表示完全保留

 细胞为sigmoid

输入门:

(一)

 

由两部分构成一部分sigmoid选出需要更新内容,tanh处理后的更新信息

(二)

我们把旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

输出门

先用sigmoid控制输出部分   再用tanh处理细胞状态的值并且乘以sigmoid的输出

 

LISTM

 变种GRU

重置门(合并输入们和遗忘门)  更新门(输出门)

 

双向LSTM

单项RNN是根据前面推后面,而双向LSTM

训练思想前向后向分别是两个RNN,而且连接着一个输出层。

就有完整的未来与过去的双向信息

向前推算:

对于双向神经网络和单项的循环神经网络一样,除了

输入序列对于隐含层是相反方向,等所有隐含层处理完所有的全部输入序列才更新

向后推算:

与标准RNN相反,除了所有输出层首先被计算,然后返回给不同方向的隐含层。

RNN代码实现:

设置参数

  # 数据
        self.x =tf.placeholder(dtype=tf.float32,shape=[None,784])
        # 标签
        self.y =tf.placeholder(dtype=tf.float32,shape=[None,10])
        #第一次的权重W(阶段正态分布)
        self.w = tf.Variable(tf.truncated_normal(shape=[28,128],stddev=0.1))
        # 偏值
        self.b = tf.Variable(tf.zeros([128]))
        #第二次的权重w(阶段正太分布)
        self.w1=tf.Variable(tf.truncated_normal(shape=[128,10],stddev=0.1))
        #偏值
        self.b1=tf.Variable(tf.zeros([10]))

前项

     # 变换形状Nsv-》Nv
        y=tf.reshape(self.x,shape=[-1,28])
        #前项计算
        y=tf.nn.relu(tf.matmul(y,self.w)+self.b)
        #还原形状
        y=tf.reshape(y,shape=[-1,28,128])
        #Cell---(输入门,输出门,遗忘门部分)
        # 有多少个神经元
        arry_cell=tf.contrib.rnn.BasicLSTMCell(128)
        # 初始化批次的每一个细胞状态
        init_state=arry_cell.zero_state(100,dtype=tf.float32)
        #细胞神经元,信息,细胞状态,是否加入时间序列
        output,finalstate=tf.nn.dynamic_rnn(arry_cell,y,initial_state=init_state,time_major=False)
        #Cell-----------------------------

        #矩阵转换后获取最后一个组合结果NV
        finalcell=output[:,-1,:]
        #输出的值(多分类用softmax)
        self.output=tf.nn.softmax(tf.matmul(finalcell,self.w1)+self.b1)

后项:

        # 求loss
        self.loss = tf.reduce_mean((self.output-self.y)**2)
        # 优化器优化
        self.opt=tf.train.AdamOptimizer().minimize(self.loss)

训练:

if __name__ == '__main__':
    net=Net()
    net.forward()
    net.backward()
    init=tf.global_variables_initializer()
    with tf.Session() as  sess:
        sess.run(init)
        for i in range(100000):
            xs,ys =Mnist.train.next_batch(100)
            loss,_ = sess.run([net.loss,net.opt],feed_dict={net.x:xs,net.y:ys})
            if i%100 == 0:
                xt,yt = Mnist.test.next_batch(100)
                out1=sess.run(net.output,feed_dict={net.x:xt})
                test_y = np.argmax(yt, axis=1)
                test_out = np.argmax(out1, axis=1)
                print(np.mean(np.array(test_y == test_out, dtype=np.float32)))
              

RNN特点:

时序长短可变

顾忌时间依赖

未来信息依赖

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值