训练识别数字图片的模型

本文根据官方教程,通过MNIST数据,使用Softmax Regressio算法训练一个输入784像素的图片,识别出其对应数字的模型

前一篇文章中我们配置了TensorFlow并根据官方教程训练了一个简单的模型,今天我们继续训练另外一个简单的模型。

MNIST包含一个手写的数字,就好像:

这个案例是为了解答:

  1. TensorFlow是怎么工作的?
  2. 机器学习的核心思想是什么?

你可以学习到:

  1. MNIST数据、Softmax Regression算法
  2. 建立一个可以基于观察图片的每一个像素来识别数字的模型
  3. 通过模型浏览上千个案例来训练模型识别数字
  4. 通过测试数据,来验证模型的准确度

I. MNIST数据

数据是在Yann LeCun’s website这上面。

该数据分为三部分

通过分离不同的数据,一部分用于训练,一部分用户测试,一部分用于学习,这样才能验证结果是训练的模型自己生成的。

  1. mnist.train: 55_000个数据用于训练
  2. mnist.test: 10_000个数据用于测试
  3. minst.validation: 5_000个数据用于验证

每个数据有两部分

  1. 手写数字的图片(x)(mnist.train.imagesmnist.test.images): 28px * 28px = 784px
  2. 对应的标签(y)(mnist.train.labelsmnist.test.labels)

如数字1:

  • mnist.[train/test].images是一个tensor,由55_000个由784个点的二维数组组成,数组中的每个值代表每个像素点,像素点有色的根据浅到深是0到1,无色为0,每个数组所呈现的数字对应一个label,我们表示为[55000,784]
  • minst.[train/test].labels也是一个tensor,由55_000个由10个值的一维数组组成,数组中有且仅有一个为1,其余为0,数组的index表示标签所代表的数字,如3表示为[0,0,0,1,0,0,0,0,0,0]],我们表示为[55000,10]

II. Softmax Regression算法

我们算法要尽量准确的通过图片(784个像素点)所呈现的,让结果中正确的数字所占的比例尽量的高,如给出的图片对应的数字是9,模型运算结果可能是: 80%的概率是9,5%概率是8,15%的概率是其他。

该算法使用场景: 从不同的事件中为一个对象分配可能性,因为该算法给我们一个0到1的列表,并且加起来等于1

大概步骤

  1. 总结输入的数据在某些类中的证据(we add up the evidence of our input being in certain classes)
  2. 将证据转化为具体的可能性

做像素强度(intensities)的加权值,当图片的强度(intentsity)与某个分类不一致,其权重为负数,当有强有力的证据证明是在那个分类,其权重为正数

最终的模型权重

蓝色为正数权重,红色为负数

大概算法

第i个类型、第j个像素、W为权重、x为输入的图片、b为偏移量

结果: $y = softmax(W_x$ + b)



III. 通过Tensorflow实现

这边的正确率是92%,是由于我们的模型非常简单,最好的模型能够达到99.7%的正确率,可以看看网上的不同模型的测试结果



Jacksgong wechat
欢迎关注Jacks Blog公众号,第一时间接收原创技术沉淀干货。