MNIST基础手写体识别 tensorflow+Python

本文参考自极客学院tensorflow官方文档中文版


首先导入MNIST数据:

from tensorflow.examples.tutorials.mnist import input_data
#number from 0 to 9:
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)

当然使用tensorflow前还要导入tensorflow:

import tensorflow as tf

MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:

它包含60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。每一张图片包含28X28个像素点。我们可以用一个数字数组来表示这张图片:


每一个数组可以展开成一个向量,长度是 28x28 = 784。如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开。在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。因此,mnist.train.labels 是一个 [60000, 10] 的数字矩阵,用来描述给定图片里表示的数字(one-hot vectors)。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。

通过操作符号变量来描述这些可交互的操作单元:

xs=tf.placeholder(tf.float32,[None,784])  #28*28
ys=tf.placeholder(tf.float32,[None,10])  #10个输出

placeholder是一个占位符,而非特定的值,我们在TensorFlow运行计算时输入这个值。None表示此张量的第一个维度可以是任何长度的,也就是说我们可以输入任意多个数据。)

定义一个创建神经网络层的函数:

def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))
    bises=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+bises

    if activation_function is None:
        outputs=Wx_plus_b
    else:
        outputs=activation_function(Wx_plus_b)

    return outputs

参数分别是inputs这个层输入,in_size这一层输入的大小,out_size这一层输出的大小,activation_function激励函数。Weights为每一个神经元对应的权重,bises为偏置量,通过Wx_plus_b=tf.matmul(inputs,Weights)+bises来对每一个输入加权求和并加上偏置量。当激励函数没有指定的时为线性关系,直接输出 Wx_plus_b,如果激励函数指定,则用相应的函数转换后再输出。

搭建一个简单的神经网络,只有输入层和输出层:

prediction=add_layer(xs,784,10,tf.nn.softmax)

因为每个图片有28x28=784个像素点,所以输入的大小为784,输出的个数为10,分别对应数字0-9。这里激励函数采用softmax回归,它能够很好的用于分类。
最优化目标函数采用交叉熵函数,它用来衡量预测值和真实值的相似度。最优化算法这里采用最基本的梯度下降法:
cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))
train=tf.train.GradientDescentOptimizer(0.3).minimize(cross_entropy)
我们优化的目的是为了 minimize(cross_entropy) 最小化交叉熵代价。这里 tf.reduce_mean tensor对象求平均值,tf.reduce_sumtensor对象求和,reduce_indices限定了在哪一个维度上求解。
此外需要定义一个函数来评估识别的准确性:
def compute_accuracy(x,y):
    global prediction
    y_pre=sess.run(prediction,feed_dict={xs:x})
    correct_prediction=tf.equal(tf.argmax(y_pre,1),tf.argmax(y,1))
    accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    result=sess.run(accuracy,feed_dict={xs:x,ys:y})
    return result
首先让我们要找出那些预测正确的标签。tf.argmax能给出某个tensor对象在某一维上的其数据最大值所在的索引值,即这个图片的标签。tf.argmax(y_pre,1)返回的是模型对于任一输入x预测到的标签值,而 tf.argmax(y,1) 代表正确的标签,我们可以用 tf.equal 来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。这个函数会给我们一组布尔值。如:True, False, True, True],为了确定正确预测项的比例,我们要用tf.cast()把布尔值转换成浮点数(tf.float32),转换后为 [1,0,1,1],然后取平均值。
构造阶段完成后, 为了启动图,我们需要创建一个 Session
 对象,并初始化所有变量:
sess=tf.Session()
sess.run(tf.initialize_all_variables())

接下来 开始训练模型,这里训练2000次,并且每隔100次输出一次训练结果(准确度):
for i in range(2000):
    batch_xs,batch_ys=mnist.train.next_batch(100)
    sess.run(train,feed_dict={xs:batch_xs,ys:batch_ys})
    if i%100==0:
        print(compute_accuracy(mnist.test.images,mnist.test.labels))

tensorflow中最好先用占位符填补对应的位置。然后使用feed_dict参数,将数据传入sess.run()函数。

完整的代码(最后可以达到准确度90%,但是由于神经网络结构简单学习的很慢):
# -*- coding:utf-8 -*-
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#number from 0 to 9:
mnist=input_data.read_data_sets('MNIST_data',one_hot=True)

def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))
    bises=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+bises

    if activation_function is None:
        outputs=Wx_plus_b
    else:
        outputs=activation_function(Wx_plus_b)

    return outputs

#计算准确度
def compute_accuracy(x,y):
    global prediction
    y_pre=sess.run(prediction,feed_dict={xs:x})
    correct_prediction=tf.equal(tf.argmax(y_pre,1),tf.argmax(y,1))
    accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    result=sess.run(accuracy,feed_dict={xs:x,ys:y})
    return result

#def placeholder for inputs
xs=tf.placeholder(tf.float32,[None,784])  #28*28
ys=tf.placeholder(tf.float32,[None,10])  #10个输出

#add output layer
prediction=add_layer(xs,784,10,tf.nn.softmax)  #softmax常用于分类

cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))
train=tf.train.GradientDescentOptimizer(0.3).minimize(cross_entropy)

sess=tf.Session()
sess.run(tf.initialize_all_variables())

for i in range(2000):
    batch_xs,batch_ys=mnist.train.next_batch(100)
    sess.run(train,feed_dict={xs:batch_xs,ys:batch_ys})
    if i%100==0:
        print(compute_accuracy(mnist.test.images,mnist.test.labels))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值