TensorFlow实例(4)--MNIST简介及手写数字分类算法

来源:互联网 发布:战斗力探测器软件下载 编辑:程序博客网 时间:2024/05/15 07:50
MNIST 是Tensoflow提供的一个入门级的计算机视觉数据集,分为两部分(训练集和测试集

其中训练集共55000张,测试集共10000张,当为None时随机读取 



每一张图又包含两部分,就称为x与y吧
x是一个长度为784的数组,每个元素都是0-1之间的数值,784等于28*28,相当于一个28*28的点阵图
y是一个长度为10的数组,每个元素是0或1,当y中第N个元素为1时,表示x这个点阵图所对应的就是N
如[0,0,1,0,0,0,0,0,0,0] 表示为 2


在Tensoflow提供的这个实例中,使用的是softmax 回归模型,归属于神经网络的一种算法,

如果对具体的模型数理算法感兴趣可以上网找找,本文不做详细介绍

这个模型计算MNIST最终的正确率大约在91%左右,并不是十分理想,但贵在简单,代码也不多

做为TensorFlow的基础篇,目的并不是学习如果使用高深的模型,可是理解如何使用TensorFlow


关于神经网络的基本原理,可以参考  机器学习(1)--神经网络初探

如果你看到上面784=28*28还是晕晕的,可以先看看 TensorFlow的MNIST手写数字还原小程序

点击此处下载Mnist数据包


# -*- coding:utf-8 -*- import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_dataimport random#读取mnist数据,下载后的Mnist并解压后,放在项目的同级目录下,通过下面程序即可读取mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)#x_data,y_data为传入量(如果对传入量不了解可参考我别的文章)在后面使用的意义是:#在训练时,None表示从训练集中取得一张图表(x_data),及图表的值(y_data)#在测试评估模型时,None表示整个测试集合x_data = tf.placeholder("float", [None, 784]) y_data = tf.placeholder("float", [None,10]) W = tf.Variable(tf.zeros([784,10]))      #神经网络的Weight的预设值,b = tf.Variable(tf.zeros([10]))          #biase偏差为一个有10个元素的'''下面一句用处就是利用 softmax模型,计算y值,在后面y值是来和实际值y_data进行比对用的softmax 回归模型 可以用来给不同的对象分配概率,如果对具体的模型数理算法感兴趣可以上网找找,这里不做介绍下面这句也就是神经网络的一个应用,通过图片x_data,自己算出一个y,不断修正Weight,这里只简单画画三个变量矩阵乘法 x_data,是一行784列的数据,W是784行10列的数据,利用矩阵乘法                                [w0_1,  w1_1,  w2_1,  w3_1,  w4_1,  w5_1,  w6_1,  w7_1,  w8_1,  w9_1  ]x_data=[x1,x2,x3...,x784]   *     ...                                [w0_784,w1_784,w2_784,w3_784,w4_784,w5_784,w6_784,w7_784,w8_784,w9_784]=[b1,b2,b3...,b10],经过  softmax 计算后,得到y,然后再与y_data比对,修正Weight,'''y = tf.nn.softmax(tf.matmul(x_data,W) + b) loss = -tf.reduce_sum(y_data*tf.log(y))#计算y值与y_的losstrain = tf.train.GradientDescentOptimizer(0.01).minimize(loss) #通过不断的神经网络训练修正Weightwith  tf.Session() as sess:    sess.run(tf.initialize_all_variables())        for i in range(1000):        #取得一张图片并做为传入量,经过1000循环调正Weights        tmpX, tmpY = mnist.train.next_batch(100)        sess.run(train, feed_dict={x_data: tmpX, y_data: tmpY})        #以下三句用入是评估模型    #1、y_data一定是0和1组成的数字,这里比较实际与计算值是否相同    prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_data,1))         #2、prediction返回的是True或False,tf.cast(prediction, "float")将这个转为浮点型True为1,最后会得到[1,0,1,0,...]    #tf.reduce_mean对所有的值求平均值    accuracy = tf.reduce_mean(tf.cast(prediction, "float"))         #3、上述测试结果,即这整个[1,0,1,0,...] 数组长度即为测试集合的长度    print( sess.run(accuracy, feed_dict={x_data: mnist.test.images, y_data: mnist.test.labels}))    #最后结果应该是在91%左右,



原创粉丝点击