TensorFlow的深度学习文章->_->通过Mnist入门

作者:陈劲灿 编辑日期: 2017年11月22日 14:22 阅读量: 441 分类: ai

什么是Mnist

Mnist的英文全称为(Mixed National Institute of Standards and Technology)

手写识别问题是在机器学习领域中的一个经典问题,该问题解决的是把28x28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9, 而Mnist数据库中有提供手写识别的训练以及测试数据。接下来我们需要做的就是获取并且读入数据、使用tensorflow进行数据的训练以及测试获得训练后手写数字识别模型的准确率。

准备

一、安装Tensorflow 并且找到下面这个路径

Mnist测试路径

二、下载Mnist数据集

1、下载地址为:http://yann.lecun.com/exdb/mnist/

2、下载下图中的四个文件

需要下载的4个文件

3、新建一个MNIST_data文件夹,并且将下载好的四个文件放入文件夹中

Mnist数据集介绍

1、 mnist中的数据集被压缩成二维的tensor,其tensor为[image index, pixel index]。 image index 代表图片的索引,pixel index代表像素的索引

2、train-*开头的文件中包含60000个样本,其中55000个训练样本,5000个验证集。则训练样本的tensor 为[55000, 784], 784 = 28x28像素。

mnist中主要包含以下数据

数据集 目的
data_sets.train 55000 组 图片和标签, 用于训练。
data_sets.validation 5000 组 图片和标签, 用于迭代验证训练的准确性。
data_sets.test 10000 组 图片和标签, 用于最终测试训练的准确性。
data_sets.train.images 训练数据集的图片
data_sets.train.labels 训练数据集的标签

data_sets.train.images的图片表示为:

data_sets.train.labels 的图片表示:

3、通过DataSet.next_batch()获取一小组数据集 images_feed, labels_feed = data_set.next_batch(FLAGS.batch_size)

开始入门

因为我们知道训练集中的手写数字是从0 - 9,可是怎么来识别这些手写数字?。 一张图肯定是0 -9 中的一个。 可以通过某一种模型给图片0-9进行概率计算,最后通过判断哪一个数字的概率比较大从而可以判定该图片对应的数字。

为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。

下面的图片是某一个模型上每个像素对于特定数字类的权值。

由先导篇中我们知道一个Sigmond神经元的工作方式。它通过输入xi 、权重wi、偏移bi等算出一个输出为0-1的值。因此对于某一张图片其为数字i的证据为:

evidence i = j W i ,   j x j + b i W i 表示权重 b i 表示偏移,j 代表给定图片 x 的像素索引用于像素求和。 **最后通过softmax将这些证据转化为概率y**: y = softmax ( evidence )

比如说使用Softmax函数计算出一张图片为6的概率为70%, 为3的概率为40%等。一般来说概率越大则越和该数字接近。

一、关于Softmax回归

这里的softmax可以看成是一个激励(activation)函数或者链接(link)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。

Softmax函数的表达式为:

softmax ( e v i d e n c e ) = normalize ( exp ( e v i d e n c e ) ) 也可以写为: softmax ( e v i d e n c e ) i = exp ( e v i d e n c e i ) j exp ( e v i d e n c e j )

上面先通过像素加权求和获取证据,然后通过softmax函数获取概率y的过程称之为softmax回归

Softmax回归的过程可以使用下面的图来表示:

Softmax回归的示意图

转化为下面的等式:

Softmax转化等式

进一步转化为矩阵乘法和向量相加的形式: 使用矩阵乘法和向量相加表示的Softmax回归

简化为下面的等式:

y = softmax ( W x + b )
二、使用“成本” 或 “损失” 函数衡量模型。

通过上面的Softmax回归模型,我们可以知道一张图片对应的数字的概率。但是我们还需要使用一个叫“交叉熵(cross-entropy)”的成本函数,来衡量这个模型的好坏。

交叉熵的定义为:

H y ( y ) = i y i log ( y i )

(1)、y预测的概率分布。 (2)、y'实际的概率分布。

三、使用Tensorflow 进行编码
  1. 通过下载Mnist数据集,模型拥有了训练数据以及测试数据。
  2. 通过每一个数字对应的图片的权重图,拥有了通过加权值来判定一个图片为某一个数字的证据。
  3. 通过Softmax回归模型将每一张图片对应数字的权重转化为概率。
  4. 通过交叉熵函数进行模型好坏的判断。
  5. 通过梯度下降算法不断的降低交叉熵的成本。
  6. 接下来就是不断的进行模型训练l。
  7. 最终通过与测试样本进行对比,获取到Mnist手写数字识别的正确概率。

下面即为完整代码:

 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf


# Import data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

# Create the model
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b

# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])

# The raw formulation of cross-entropy,
#
#   tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)),
#                                 reduction_indices=[1]))
#
# can be numerically unstable.
#
# So here we use tf.nn.softmax_cross_entropy_with_logits on the raw
# outputs of 'y', and then average across the batch.
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
# Train
for _ in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images,
                                    y_: mnist.test.labels}))

总结

使用tensorflow进行手写数字的识别需要准备好可用的训练以及测试数据。


上一篇
下一篇
TensorFlow的深度学习文章->_->基础API的熟悉与使用
HTTP中使用的Status Code

留一个言试试