在人工智能(AI)的世界里,手写数字的识别证明你的神经元是正确的,处于工作状态。人工智能的这种应用已经相当古老了——它的突破出现在1989年,当时实现了对邮政服务的邮政编码进行可靠的机器解析。不久之后,多层前馈网络被证明可以实现任何功能。不久,金融机构就采用了自动解析电汇或银行支票汇款单上的账号的技术。如今,使用不同的人工智能技术识别手写数字在学术界也因教学目的而闻名。
手写数字识别比较复杂
虽然这些年来问题本身的呈现方式并没有改变,但在最近几十年里,计算能力急剧增加,使得现在可以在计算机上运行识别现场可编程门阵列适合教学用的板子,配上小型数码相机。然而,这仍然是人工智能难以解决的任务之一。手写的数字大小、宽度和方向各不相同,每个人的笔迹也各不相同。不同的文化甚至会以不同的方式书写数字。例如,美国人和欧洲人写数字1、4或7的方式存在细微的差异。
另一个引起数字识别问题的领域是一些数字之间的相似性:3和8,0和8,5和6,2和7,等等。最后但并非最不重要的是,图像本身的质量有很大的影响。如果没有经过适当的训练,人工智能就会错误地将太多的数字分类,使最终产品无法发挥任何作用。尝试使用经典的编程方法来实现这样的识别系统将使程序员在大量的细节和特殊情况下遇到很多麻烦。
实施教科书版本
但这种识别是如何工作的呢?从一个非常高的层次来看,它很简单:数字的图像需要被捕获、处理和分析,然后将结果呈现给用户。
如果进行更彻底的分析,很快就会发现需要执行更多的任务,解决更多的问题。这种系统的硬件并不是真正的障碍。例如,Digilent通过人工智能实现了一个教科书版的数字识别,作为一种概念证明500万像素Pcam 5C定焦彩色摄像模块对于图像的捕捉,他们Zybo Z7 Xilinx Zynq-7000 ARM/FPGA开发板,它的Pmod MTDS多点触控显示系统作为用户界面,并显示识别过程的结果(整个设置在我们的折扣嵌入式视觉包).
一旦Pcam 5C捕捉到1000 * 1000像素的数字图像(这对这个应用程序来说实际上是多余的),它就会通过MIPICSI-2接口(MIPI摄像机串行接口2),并在FPGA上进行预处理。在这里,它将缩小到500x500像素,转换成灰度,最后二进制化为黑白。
进一步的处理在667兆赫的双核上进行ARM-Cortex-A9处理器一个边界框搜索——搜索包含数字的最小帧——执行数字集中在边界框(定心的重心在一个更大的窗口会被另一种可能性)和边界框缩放的图像大小28 28个像素。之所以选择这个大小,是因为神经网络的训练集使用这个分辨率。
从这幅图像中,每个像素被用作FPGA上前馈人工神经网络(ANN)的784 (28 x 28)输入神经元中的一个输入神经元。每个神经元使用定点Q4.11表示,由一个乘法器和一个加法器组成,乘法器将输入像素宽度乘以从训练中得到的权值,加法器将偏差(也是由训练数据产生的)加到乘法结果中(见上图)。最后,一个s形函数被用来创建神经元的激活输出。公式1和2给出了数学细节:
一个=σ(w∙x + b)(方程1)
σ(z) = 1 / (1 + e ^ (- z))(公式2)
其中w是权值,b是偏差,s形函数。
然后,输入层的激活输出被用作第一个隐藏层的所有16个神经元的输入,这个听起来神秘的术语“隐藏层”意味着这一层的神经元既不是输入神经元,也不是输出神经元。然后,隐藏层1的输出被用作第2个隐藏层(也由16个神经元组成)所有神经元的输入。该系统有两层隐藏层,技术上可称为深度神经网络(深度学习),但无法与其他几千层的系统相比。
每个输出神经元对应一个数字
输出层最终由10个神经元组成,每个神经元代表[0…9]范围内的每个数字。每个输出神经元都有一个激活值,激活值最高的神经元被认为是正确的猜测。例如,如果表示数字4的输出神经元有最大值,我们就认为数字4是识别的最佳猜测。
由于神经网络的输出本身不是概率,所以结果的确定性程度是无法得知的。但这可以通过在网络中添加Softmax层来解决,它将数字转化为概率。识别的最终结果显示在Pmod多点触控显示系统上。
培训是最重要的
与所有人工神经网络一样,该系统在使用前需要进行训练。在我们的示例中,普遍性定理应用到计算重量和偏见的图像广泛应用MNIST——(NIST)修改数据库,它包括60000 10000训练图像和测试图像,两组与标记的手写数字图像范围从零到十岁。这个数据库被称为MNIST,因为它是NIST(美国国家标准与技术协会)收集的数据集的子集。该培训是在使用Python的PC上监督和执行的。每个训练集都是一对输入和期望的输出,训练算法取自Michael a . Nielsen的开源教科书[1].
成就是什么?
训练后的人工神经网络对MNIST测试图像的识别率达到95.2%。如果使用卷积神经网络(CNN),可以实现更高的速率。使用由35个卷积神经网络组成的层次结构获得的最佳学术结果的错误率为0.23%,这超出了这个概念证明的范围。同时,由于没有实现自动去偏置,而是手工去偏置,因此实时识别率对数字偏置的影响很大。最关键的数字是数字“9”,这个数字很少被示威者识别出来。一旦转向,它大多被认为是“6”,这表明对系统进行再培训应该会有所帮助。
如果仅在Digilent的Zybo Z7开发板上的双核ARM-Cortex-A9处理器上进行预处理,则需要1664毫秒,如果在arm内核和FPGA上进行预处理,则需要999毫秒。人工神经网络在ARM上的执行时间为73 ms,在ARM + FPGA上的执行时间为57 ms。
这个使用低成本fpga板实现的手写数字识别的教科书,证明了在这样一个系统上实现具有深度学习的人工神经网络是可能的。Xilinx Zynq-7000 ARM/FPGA开发板,连同Pcam 5和Pmod MTDS显示器——都是由Digilent提供的,可以在嵌入式视觉包-允许简单地采取一本教科书,并实现一个实时捕获和推理系统从零开始。
[1]Michael A. Nielsen,《神经网络与深度学习》,决心出版社,2015 (http://neuralnetworksanddeeplearning.com/chap1.html)

谢谢分享!这是一个非常有趣的讨论。
大家好,非常有趣的文章,谢谢。你有关于实现神经网络的代码来分享吗?