欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993

程序员文章站 2022-07-07 11:10:46
...

1. 下载MNIST数据集 
当我们开始学习编程的时候,第一件事往往是学习打印”Hello World”。就好比编程入门有Hello World,机器学习入门有MNIST。 
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
每张图片大小为28*28,展开成一维行向量就是784维,即每张图片就是784维空间中的一个点。 
tensorflow提供一个input_data.py文件,专门用于下载mnist数据,我们直接调用就可以了,代码如下:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
  • 1
  • 2

执行完成后,会在当前目录下新建一个文件夹MNIST_data, 下载的数据将放入这个文件夹内。下载的四个文件为: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
每个子集都由两部分组成:图片部分(images)和标签部分(labels), 我们可以用下面的代码来查看 :

print(mnist.train.images.shape)
print(mnist.train.labels.shape)
print(mnist.validation.images.shape)
print(mnist.validation.labels.shape)
print(mnist.test.images.shape)
print(mnist.test.labels.shape)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

以上代码第一行会输出结果(55000, 784),表明训练集为一个55000行,784列的数组,55000即是训练集图片的总数,784即是每一张二维图片展开成一维所得值。 
2. 神经网络 
神经网络没有卷积功能,只有简单的三层:输入层,隐藏层和输出层。 
数据从输入层输入,在隐藏层进行加权变换,最后在输出层进行输出。输出的时候,使用softmax回归,输出属于每个类别的概率值: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
如果把它写成一个等式,我们可以得到: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
我们也可以用向量表示这个计算过程:用矩阵乘法和向量相加。这有助于提高计算效率。 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
其中,x1,x2,x3为输入数据,经过运算后,得到三个数据属于某个类别的概率值y1,y2,y3. 更进一步,可以写成更加紧凑的方式: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
在训练过程中,我们将真实的结果和预测的结果相比(交叉熵比较法),会得到一个残差。公式如下: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993 
y 是我们预测的概率值, y’ 是实际的值。这个残差越小越好,使用梯度下降法,不停地改变W和b的值,使得残差逐渐变小,最后收敛到最小值。这样训练就完成了,就得到了一个模型(W和b的最优化值)。 
3. 完整代码 
完整代码如下:

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data

#下载并加载数据
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)

#数据与标签的占位
x = tf.placeholder(tf.float32,shape = [None,784])
y_actual = tf.placeholder(tf.float32,shape=[None,10])

#初始化权重和偏置
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#softmax回归,得到预测概率
y_predict = tf.nn.softmax(tf.matmul(x,W) + b)
#求交叉熵得到残差
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_actual*tf.log(y_predict),reduction_indices=1))
#梯度下降法使得残差最小
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

#测试阶段,测试准确度计算
correct_prediction = tf.equal(tf.argmax(y_predict,1),tf.argmax(y_actual,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,'float'))#多个批次的准确度均值

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    #训练,迭代1000次
    for i in range(1000):
        batch_xs,batch_ys = mnist.train.next_batch(100)#按批次训练,每批100行数据
        sess.run(train_step,feed_dict={x:batch_xs,y_actual:batch_ys})#执行训练
        if(i%100==0):#每训练100次,测试一次
            print("accuracy:",sess.run(accuracy,feed_dict={x: mnist.test.images, y_actual: mnist.test.labels}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

运行结果如下: 
使用tensorflow利用神经网络分类识别MNIST手写数字数据集,转自随心1993

参考: 
1.http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html 
2.http://www.cnblogs.com/denny402/p/5852983.html