tensorflow(六):RNN实现手写体识别MNIST

一、RNN结构

   这是一个标准的RNN结构图,图中每个箭头代表做一次变换,也就是说箭头连接带有权值。左侧是折叠起来的样子,右侧是展开的样子,左侧中h旁边的箭头代表此结构中的“循环“体现在隐层。
   在展开结构中我们可以观察到,在标准的RNN结构中,隐层的神经元之间也是带有权值的。也就是说,随着序列的不断推进,前面的隐层将会影响后面的隐层。图中O代表输出,y代表样本给出的确定值,L代表损失函数,我们可以看到,“损失“也是随着序列的推荐而不断积累的。
   除上述特点之外,标准RNN的还有以下特点:
   1、权值共享,图中的W全是相同的,U和V也一样。
   2、每一个输入值都只与它本身的那条路线建立权连接,不会和别的神经元连接。

 

  以上是RNN的标准结构,然而在实际中这一种结构并不能解决所有问题,例如我们输入为一串文字,输出为分类类别,那么输出就不需要一个序列,只需要单个输出。如图。 

 

 

  同样的,我们有时候还需要单输入但是输出为序列的情况。那么就可以使用如下结构: 

这里写图片描述

   还有一种结构是输入虽是序列,但不随着序列变化,就可以使用如下结构:

这里写图片描述

 

 二、LSTM结构

   Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力。所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

推荐博客:https://blog.csdn.net/zhaojc1995/article/details/80572098

三、tensorflow代码实现

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
#输入的图片是28*28
n_inputs=28 #输入一行,一行有28个数据
max_time=28 #一共28行,执行的次数。图像是28*28的,一行训练一次,共训练28次。
lstm_size=100 #隐层单元
n_classes=10 #10个分类
batch_size=50 #每批次50个样本
n_batch=mnist.train.num_examples // batch_size #计算一共有多少批次
#这里的none表示第一维度可以是任意的长度
x=tf.placeholder(tf.float32,[None,784])
#正确的标签
y=tf.placeholder(tf.float32,[None,10])
#初始化权值
weights=tf.Variable(tf.truncated_normal([lstm_size, n_classes], stddev=0.1))
#初始化偏执值
biases=tf.Variable(tf.constant(0.1,shape=[n_classes]))
#定义RNN网络
def RNN(X,weight,biases):
    #inputs=[batch_size,max_time,n_inputs]
    inputs=tf.reshape(X,[-1,max_time,n_inputs])
    #定义LSTM基本CELL
    lstm_cell=tf.contrib.rnn.BasicLSTMCell(lstm_size)
    outputs,final_state=tf.nn.dynamic_rnn(lstm_cell, inputs,dtype=tf.float32)
    #final_state[1]是隐藏层状态,0是细胞状态,有图可知,LSTM细胞输出有两个,一个是细胞状态,一个是隐层状态
    results=tf.nn.softmax(tf.matmul(final_state[1], weights) + biases)
    return results
#计算rnn的返回结果
prediction=RNN(x, weights, biases)
#损失函数
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))
#使用AdamOptimizer进行优化
trian_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#结果存放在一个布尔型列表中
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) #argmax返回一维张量中最大的值所在的位置
#求准确率
accuarcy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) #把correct_prediction变为float32类型
#初始化
init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(50):
        for batch in range(n_batch):
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            sess.run(trian_step, feed_dict={x:batch_xs,y:batch_ys})
        acc=sess.run(accuarcy, feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print ("Iter "+str(epoch)+", Testing Accuarcy= " + str(acc))

四、运行结果

Iter 0, Testing Accuarcy= 0.6849
Iter 1, Testing Accuarcy= 0.7931
Iter 2, Testing Accuarcy= 0.8225
Iter 3, Testing Accuarcy= 0.8967

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值