利用神经网络识别手写数字(一)

人类视觉系统是非常神奇的,要想用机器模拟人的视觉系统是件非常困难的事情,但我们可以采用某种数学工具无限逼近真实情况,将猜错的概率降到最低。我们下边就讲一下采用数学手段如何识别手写数字。我们在学习训练过程中采用的样本集MNIST是一个入门级的计算机视觉数据集,如下图所示的图片:

它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1,9,2。

对于人类来讲,识别图片中的数字似乎是毫不费力,但事实上人类在能够识别这些数字之前已经进行了大量的训练,首先我们学会了认识数字,然后学习书写,与此同时在大量实践中不断认识各种各样的书写字体。在人类识别图片时,首先通过视觉系统捕获图片信息,然后通过大脑进行计算得出正确的结论。在我们大脑各半球,有一个主要的视觉皮层,即V1,它包含1.4亿个神经元以及数以百亿的神经元连接。而且人类不只是有V1,还有一系列的视觉皮层——V2,V3,V4和V5,它们能够执行更加复杂的图像处理。我们可以将大脑想象成一台超级计算机,在几亿年的发展进化中不断改进,最终才达到现在这样能够通过视觉识别、理解世界。要识别手写数字不是一件非常容易的事。然而,我们人类却能非常惊人的通过我们的眼睛理解所看到的一切,但是几乎所有的工作都是在不知不觉中完成的,以至于我们不会赞叹我们的视觉系统解决的问题有多么艰难。

视觉模式识别困难在于如何让计算机程序准确识别图片上的数字。这里我突然想起我女儿在学习数字时经常背的一首儿歌:1像铅笔能写字,2像小鸭水中游,3像耳朵很听话,4像红旗迎风飘,5像称钧秤白菜,6像口哨能吹响,7像镰刀割青草,8像葫芦能装水,9像饭勺能盛饭,10像油条和鸡蛋。如果我们尝试让电脑像这样去学习数字,那意味着必须首先要让电脑学会识别铅笔、小鸭子,而对于实物来讲,每一种都具有多种属性,形状、材质、用途等等,显然这条路径根本行不通。

我们这里选用一种比较简单的数学模型构建我们的机器学习系统——Softmax Regression。Softmax Regression是逻辑回归的推广,逻辑回归是用来处理二分类问题,而Softmax Regression用来处理多分类问题。下边我们简单介绍一下回归相关的知识。

逻辑回归

用来分析二分类问题,有两个重要公式,Sigmoid跃阶函数,Loss Function损失函数。逻辑回归主要计算两种情况出现的概率和,所以叫二分类。

有两个Softmax回归

Softmax要解决的是k种情况出现的概率问题。其概率推演公式:

损失函数,

我相信绝大多数人看了上边的公式是崩溃的,如果有数学基础我建议选本大学教材线性代数、概率统计学学,没有数学基础,但有志于人工智能行当的同学也不用灰心,接下来我们采用更加平易近人的方式讲讲Softmax。

在深入探讨Softmax之前,我们需要先了解一下MNIST样本集的情况。MNIST 数据集来自美国国家标准与技术研究所, 是National Institute of Standards and Technology 的简称,数据由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员。MNIST由两部分数据构成,一部分是用来训练模型的数据集(mnist.train)60000行,另外一步是用来测试的数据集(mnist.test)10000行。每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。数据集下载地址[http://yann.lecun.com/exdb/mnist/]。

为什么不是一张一张的图片?在这些数据中存了哪些信息?

第一个问题很好回答,人在记忆一个场景或一张照片的时候,也不是直接把照片存在大脑里,而是把图像进行了信息化处理,同样的道理,图片对于模型来讲无法直接参与运算,所以在输入到模型里之前,我们需要对图片进行数字化处理。那么,怎么数字化呢?这也正是我们第二个要探寻的问题。首先,我们先来看一张图片。

这是一张28X28的图片,也就是说这张图片由28X28 = 784个像素点构成。在每一个像素点都会有一个数值与其对应,这个值就是灰度,介于0~255之间。如果样本是彩色图片,处理起来会稍有不同。人眼所见所有颜色都由红、绿、蓝三原色构成,所以彩色像素点表示为RGB(r,g,b),R、G、B分别标识Red、Green、Blue。假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:

浮点算法:Gray=R*0.3+G*0.59+B*0.11

整数方法:Gray=(R*30+G*59+B*11)/100

移位方法:Gray =(R*28+G*151+B*77)>>8;

平均值法:Gray=(R+G+B)/3;

仅取绿色:Gray=G;

好了,现在我们已经知道mnist.train.images、mnist.train.labels中是什么数据了。在MNIST训练数据集中,mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。mnist.train.labels是介于0到9的数字,用来描述给定图片里表示的数字。为了用于这个教程,我们使标签数据是"one-hot vectors"。 一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。所以在此教程中,数字n将表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。因此,是一个的数字矩阵。

样本数据已经解释清楚了,接下来我们来讲一下Softmax模型。

首先,假设要识别一张包含9的图片,那么模型判断数字是9的依据是什么呢?概率。如果在计算得到图片为9的概率是90%,而同时是6或8的概率是6%,那么,我们有理由相信这个图片中的数字应该是9。这里我们提到的这个概率即是Softmax要解决的问题。我们将每个像素的强弱对于数字i的判断的影响标识称线性相关,如下试:

其中,w代表当图片为i时的权重,b为我们设置的偏置量(bias)。有了上边的准备,在运算的过程中我们就可以把对evidence的计算转化为概率y的问题:

上试可以采用向量运算来表示:

图(一)

图(二)

更为紧凑简洁的表示方式:

到此softmax模型的原理就简单讲完,那么,如何用代码去实现呢?请大家关注公众微信号,我会在后续文章中采用TensorFlow和Keras两种技术框架进行实现,敬请期待。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180726G16AWR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券