用简单卷积神经网络实现MNIST数据集识别

  • Post author:
  • Post category:其他

       第一次写博客,记录一下最近的学习经历吧,最近在学卷积神经网络,自己就写了一个比较简单的卷积神经网络实现了MNIST数据集的识别,本来是想用LeNet5来实现的,感觉LeNet5太老了,所以就写了一个差不多的卷积神经网络来实现MNIST数据集的识别。希望可以帮助一些刚学习卷积神经网络的朋友,也可以根据我的框架也写出来自己的神经网络。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('../datas/mnist',one_hot=True)
#设置超参数
learn_rate=1e-3
train_epoch=15000
batch_size=50
#设置占位符
x=tf.placeholder(tf.float32,shape=[None,784],name='x')
y=tf.placeholder(tf.float32,shape=[None,10],name='y')
#定义接收变量的函数
def get_variable(name,shape=None,dtype=tf.float32,initializer=tf.random_normal_initializer(mean=0,stddev=0.1)):
    return tf.get_variable(name,shape,dtype,initializer)
#开始写网络层,第一层是输入层
with tf.variable_scope('input1'):
    net=tf.reshape(x,[-1,28,28,1])
#第二层是卷积层
with tf.variable_scope('conv2'):
    net=tf.nn.conv2d(input=net,filter=get_variable('w',[5,5,1,20]),strides=[1,1,1,1],padding='SAME')
    net=tf.nn.bias_add(net,get_variable('b',[20]))
    net=tf.nn.relu(net)
#第三次是池化层
with tf.variable_scope('pool3'):
    net=tf.nn.max_pool(value=net,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
#第四层是卷积层
with tf.variable_scope('conv4'):
    net=tf.nn.conv2d(input=net,filter=get_variable('w',[5,5,20,50]),strides=[1,1,1,1],padding='SAME')
    net=tf.nn.bias_add(net,get_variable('b',[50]))
    net=tf.nn.relu(net)
#第五层是池化层
with tf.variable_scope('pool5'):
    net=tf.nn.max_pool(value=net,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
#第六层是全连接层
with tf.variable_scope('fc6'):
    net=tf.reshape(net,[-1,7*7*50])
    net=tf.add(tf.matmul(net,get_variable('w',[7*7*50,1024])),get_variable('b',[1024]))
    net=tf.nn.relu(net)
#第七次是dropout层,丢弃一些权重,防止过拟合
with tf.variable_scope('dropout7'):
    net=tf.nn.dropout(net,keep_prob=0.5)
#最后一层在做一个全连接和softmax
with tf.variable_scope('fc8'):
    net=tf.add(tf.matmul(net,get_variable('w',[1024,10])),get_variable('b',[10]))
    act=tf.nn.softmax(net)
#接下来定义损失函数
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=act,labels=y))
#接下来定义训练方式
train=tf.train.GradientDescentOptimizer(learning_rate=learn_rate).minimize(loss)
#接下来产生一个预测值
y_pred=tf.equal(tf.argmax(act,axis=1),tf.argmax(y,axis=1))
#用预测值来计算正确率
acc=tf.reduce_mean(tf.cast(y_pred,tf.float32))
#定义随机变量
init=tf.global_variables_initializer()
#开启会话,开始训练过程
with tf.Session() as sess:
    sess.run(init)
    #得到批次的大小
    batch_xs,batch_ys=mnist.train.next_batch(batch_size)
    #得到喂入字典的大小
    feeds={x:batch_xs,y:batch_ys}
    #开启训练过程
    for i in range(train_epoch+1):
        sess.run(train,feed_dict=feeds)
        #每隔20轮输出一下准确率
        if i%20==0:
            print('第%d轮准确率为%.3f'%(i,sess.run(acc,feed_dict=feeds)))

         这次写的神经网络结构还是比较简单的,最后准确率大概有98%左右,感觉识别效果还是不太好,大家可以自行更改一些参数和迭代方式可能准确率会有一些提升。


版权声明:本文为weixin_45414789原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。