TensorFlow入门教程(四):MNIST手写数字识别简单版

一、  MNIST数据集简介

   MNIST数据集官网:http://yann.lecun.com/exdb/mnist/

  • 下载下来的数据集被分成训练数据和测试数据两部分,其中训练数据有60000个,测试数据有10000个
  • 每一张图片包含28*28个像素,我们把这一个数组展开成一个向量,长度是28*28=784。因此在MNIST训练数据集中mnist.train.images是一个形状为 [60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。图片里的某个像素的强度值介于0-1之间。

TensorFlow入门教程(四):MNIST手写数字识别简单版_第1张图片

  • MNIST数据集的标签是介于0-9的数字,我们要把标签转化为"one-hot vectors"。一个one-hot向量除了某一位数字是1以外,其余维度数字都是0,比如标签0将表示为([1,0,0,0,0,0,0,0,0,0]),标签3将表示为([0,0,0,1,0,0,0,0,0,0])。因此,mnist.train.labels 是一个[60000, 10]的数字矩阵。

二、  神经网络构建

由于每张图片的像素个数为784,所以,输入层为784,先设计一个一层网络,0-9共有10个分类,所以,输出层有10个神经元,网络结构如下:

TensorFlow入门教程(四):MNIST手写数字识别简单版_第2张图片

MNIST的结果是0-9,假设我们的模型推测出一张图片是数字9的概率是80%,是数字8的概率是10% ,然后其他数字的概率更小,总体概率加起来等于1。这是一个使用softmax回归模型的经典案例。softmax模型可以用来给不同的对象分配概率。其公式如下:

TensorFlow入门教程(四):MNIST手写数字识别简单版_第3张图片

三、  代码

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

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)  # 载入数据
batch_size = 100  # 每个批次大小
n_batch = mnist.train.num_examples // batch_size  # 批次数目

x = tf.placeholder(tf.float32, [None, 784])  # 输入,输出占位符
y = tf.placeholder(tf.float32, [None, 10])

# 创建一个简单的神经网络
w = tf.Variable(tf.zeros([784, 10]))  # 输入784,输出10
b = tf.Variable(tf.zeros([10]))

prediction = tf.nn.softmax(tf.matmul(x, w)+b)  # 将数值转换成预测概率

loss = tf.reduce_mean(tf.square(y - prediction))  # 求预测平均误差

train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss)  # 梯度下降法使误差减小,学习率为0.3
init = tf.global_variables_initializer()  # 变量初始化

correct_prediction = tf.equal(tf.arg_max(y, 1), tf.arg_max(prediction, 1))
# arg_max返回一维张量中最大值所在位置,将预测值与真实值用equal进行是否相等判断,结果为True False
accuary = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# cast将correct_prediction中数据转化为float型,并求均值,计算正确度
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(20):  # 共训练20次
        for batch in range(n_batch):  # 训练一次,进行的次数
            batch_x, batch_y = mnist.train.next_batch(batch_size)  # 取出待训练数字 batch_x为图像,batch_y为标签
            sess.run(train_step, feed_dict={x: batch_x, y: batch_y})  # 进行训练
        acc = sess.run(accuary, feed_dict={x: mnist.test.images, y: mnist.test.labels})  # 计算准确率
        print("Iter" + str(epoch) + ",acc" + str(acc))

 

运行结果:

Iter0,acc0.858
Iter1,acc0.8822
Iter2,acc0.8926
Iter3,acc0.8958
Iter4,acc0.8997
Iter5,acc0.9035
Iter6,acc0.9057
Iter7,acc0.9077
Iter8,acc0.9093
Iter9,acc0.9101
Iter10,acc0.9115
Iter11,acc0.912
Iter12,acc0.9127
Iter13,acc0.9141
Iter14,acc0.9152
Iter15,acc0.9153
Iter16,acc0.9166
Iter17,acc0.9173
Iter18,acc0.9174
Iter19,acc0.9173

由运行结果可得,训练20次后,准确度达到了91.73%,这只是一个单层的网络!

你可能感兴趣的:(TensorFlow)