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

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_data
import 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_的loss
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss) #通过不断的神经网络训练修正Weight


with  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%左右,



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值