编程语言应用

首页 » 常识 » 问答 » 手写数字识别
TUhjnbcbe - 2024/4/26 19:21:00

随着人工智能的火热,我周围不少人都在学习相关技术,但了解后大部分人的反应是:人工智能学起来难度太大了!究其原因,还是因为AI编程与传统编程差异明显,且涉及的知识量非常庞大,入门不易。

这一讲,我会用简单易懂的故事和比喻,带你轻松理解AI中大火却又晦涩难懂的概念——神经网络。

在课程中你能学习如下三个干货:

1.神经网络擅长处理哪类问题?

2.神经网络是如何识别数字验证码?

3.自已给神经网络下个定义。

如果你对此感兴趣,以后想转行AI应用开发或AI产品经理,相信这一篇内容会对你入门人工智有所帮助。

为什么需要神经网络?

开始学习之前,我们先要思考一个问题,我们为什么需要深度学习技术?

回答这个问题,我们先从为什么需要神经网络开始,因为深度学习模型是基于多层神经网络搭建而成的。可以说,多层神经网络就是深度学习另一种叫法。

理解神经网络,先从过年抢票这个事开始。

时间回到若干年前,网站刚推出时相信大家都在网站上抢过票。在网站上抢票,每抢一次都需要输入一次验证码,这让用户很烦。因为有些验证码长得非常奇葩,用户在辨认这些验证码时还经常搞错,错了又要重新输入一次。明明是看着是有余票的,但是却因为前面输入验证码浪费了太多时间,票却被别人给抢走了,心中十分不爽。

正是看到了这样的用户痛点,老板找到产品经理说了一个设想,这个设想就是由软件来自动识别验证码并输入,无需人工识别和输入,这样就可以实现用户预先下单,如果订票成功就自动出单。这样一来用户岂不爽死,用户用的爽可以先让他用,形成了依赖之后,公司就可以推出相应的会员及收费产品,比如只有成为付费会员之后,才能够使用自动下单的功能。

产品经理非常认同老板的想法,还觉得实现这个验证码识别功能挺简单的。因为当初网站上的验证码还仅仅只是数字,只要识别0~9这10个阿拉伯数字就可以了。产品经理觉得这样一个小case直接找个开发搞定就行了。

产品经理找来开发人员,大致讲解了下需求,还给了如下的验证码图片让开发人员参考。

开发人员收到了产品经理提交的这个需求之后,琢磨了半天找到产品经理,说这个事情真做不到。产品经理疑惑地看着开发人员说道,为什么呀?就10个数字,幼儿园小朋友能认全了,写个IFELSE,几行逻辑判断就搞定了,你给我说这个事情做不到,为什么呀?

开发人员说,我根本没有办法把数字的识别规则给全部找出来,就以上图这个验证码为例来说,网站让用户输入验证码时,用户看到是图片,这点你明白吗?

产品经理点点头说,我明白,这有什么问题吗?

这点你明白就好,开发人员接着说到,编程程序去网站上读取到的信息也是图片,并不能得到对应的数字,如果能直接得到数字,就能直接写个SwitchCase或者IFELSE搞定了。

可是我只能得到图片,而且这张图片是还有4个数字,我要先把图片先切成4份,比如下图这个样子。

产品经理看到切成了4份,说这样不就更好识别了吗?现在只要把每张图片中的数字提取出来了就行了。

开发人员听到产品经理如此说法,盯着产品经理说道,你认为好做,那你来做?

产品经理一听开发人员口气不善,赶紧改口道,那你认为不好做,究竟是什么原因引起的呢?

开发接着说到,有如下两个原因:

1)9这个数字图片上有一些红点,当有了这些红点之后,我写程序必须把这些红点所在的位置给罗列出来,然后与我们系统中已经预设好的图片进行比对,如果相似则判断为9,否则程序根本无法判断这个是一个数字9,但是这些红点是网站随机生成的,我写程序不可能把这些未知的条件给出来,其他的数字也同样存在类似的情况,所以根本做不了。

2)很多数字有多种图片表现形式,比如数字3,就有如下三种形态。

每张图片中的白色像素布局都不一样,有的3白色部分在下方比较多,有的上方比较多,有的不多不少。这只是三种表现形式,但其实可以有无数种,可以由网站随机生成一种表现形式,我编程根本不可能知道给出的是哪种表现形式,所以也就无法写程序了。

产品经理听完开发人员的解释,也觉得合情合理,就犯起难来。没想到一个人类看上去很简单的数字识别,竟然无法用编程实现,老板交待的任务难道完不成了吗?

但是转念一想,听说国外已经有类似的软件产品,于是把这个情况和开发人员说了。开发人员说他也知道此事,据说这个产品使用了基于神经网络的深度学习OCR识别技术搞定了验证码识别,开发人员建议产品经理找算法工程师聊一聊,因为他好像是在研究神经网络和机器学习。

产品经理收到了开发人员的建议之后,就去找算法工程师。算法工程师听完了产品经理的需求之后,慢悠悠地说,这个事情机器学习和深度学习都能够搞定,他们都特别擅长处理这种在人类看来有规律,且又有大量数据证明这种规律存在,但传统编程就是无法实现的事情。

算法工程师建议产品经理学习《四天入门深度学习》这门课程,了解AI产品开发过程中的基础知识,有利于后续工作中的相互沟通。

产品经理听完算法工程师的话,悬着的心总算是落下来了,老板交代的事情肯定是能完成了。

神经网络是如何解决验证码识别问题的?

好奇心超强的产品经理有了新的疑惑,什么是神经网络?神经网络是如何解决验证码识别问题的?

带着这两个问题,产品经理找到算法工程师请教,算法工程师听完产品经理的问题,说道我们先来了解神经网络是是如何解决验证码识别的问题?在理解了神经网络是如何识别数字图片之后,你就可以尝试给出神经网络的定义。

先看下面这几张用12个灰黑、灰白方块组成的图:

算法工程师:你看这些图片看上去是哪个数字呢?

产品经理:都是数字0呀。

算法工程师:那还会不会有其他的表现形式呢?

产品经理:还有很多的,比如下面这几张图都可以表示数字0。

此时站在旁边偷听的开发人员说道其实还会有很多其他组合模式,很难穷尽,这只是12个黑白方块,如果不只12个呢,怎么办,传统编程根本解决不了这个问题。

此时算法工程师说道,是的,传统编程根本解决不了这个问题,是因为答案不标准。每个方块,我们都可以理解成是一个像素,而由12个二值像素组成的数字0,其组合模式也是多种多样的,远远不只我们列出的这8种。对于这种没有标准答案,识别困难的问题,基于神经网络的深度学习技术是可以解决的。下面我们就通过一个三层的组织架构图来讲解神经网络是如何识别出数字0和1的。

先看理解神经网络这幅图:

这张图箭头很多,是不是看起来很复杂?不要担心,接下来我为你一一拆解。

首先,我们先大致了解下整体的架构,分别是输出层、隐藏层和输入层。在图中所示的组织架构中,输入层(最下层)有12个员工,他们分别代别代表数字0或1的12个黑白方块,即12个黑白像素。隐藏层有A、B、C三位中层领导,输出层有0号和1号两位大领导。

输入层的12个员工就是负责把自身像素是什么颜色汇报给隐藏层的中层领导(神经元)A、B、C。隐藏层的领导获得了12个员工是什么颜色的信息之后,进行整合,再把整合结果向输出层两个领导(神经元)汇报,由输出层0、1两个大领导来判断数字究竟是“0”还是“1”。

现在的关键是隐藏层领导是如何进行整合,这对于输出层领导做决策是决定性的。

隐藏层的领导究竟是如何进行整合的呢?仔细来研究下,发现隐藏层领导A、B、C有不同的喜好,他们分别喜欢下图所示的模式A、模式B、模式C的图案。

最上层的两个输出层大领导,也是从下层的三个隐藏层ABC领导那里得到信息,并对信息进行整合的。如果输出层0号领导整合后的信息比1号领导整合后的信息值大的话呢,就判定数字为0,反之就判定数字为1。具体如下图所示:

隐藏层领导A、B、C对模式有各自的偏好,和12个手下员工有不同的交情。领导A的偏好是之前的模式A,因此和4号还有7号关系好,因为模式A的4号像素与7号像素是黑色。中层领导的各自偏好见下图:

隐藏藏层领导A、B、C和输出层的领导也有着人际关系,由于某种关系输出层0号领导和隐藏层领导A、C关系较好,输出层1号领导与隐藏层B领导关系较好。注意图中白色粗线代表关系好。

在把三个层次之间的关系说明白以后,我们来试着使用这个组织架构(神经网络)读入如图所示的数字0,看看会产生什么反应呢?

变黑的4号和7号员工向性情相投的隐藏层领导A传递了较强的信息。变黑的6号、9号员工也向性情相投的隐藏层领导C传递了较强的信息。由于5号、8号员工的颜色没有变黑,所以隐藏层领导B是没有得到较强的信息,这就直接导致了如图所示的结果。

隐藏层领导A、B、C对接收到的信息进行整合之后向输出层领导汇报,输出层0号领导和1号领导根据关系好坏程度分别对信息整合,最后0号领导得到的信息值很强,而1号领导得到信息值较弱,所以判断数字为0,具体过程如图所示。

到此领导的神经网络终于推导出正确答案了。

神经网络的通俗定义和概念理解

产品经理听完了算法工程师这段讲解之后,悠悠说到原来神经网络就是职场呀。

开发人员听到这个定义之后不禁朝产品经理竖起了大拇指,这定义也太精辟了。

算法工程师说到初学者入门阶段给神经网络下个通俗定义是可以的,但是,神经网络是仿生人脑神经网络工作机理(如动图)构建而成,并且在数学上有严谨的定义,比如关系好如何定义、隐藏层领导何时决定向上层传递信息,是由隐藏层领导根据自已实际情况来判断是否还需要把信息向上层汇报,而这个判断如何来定义,只有从数学上给出定义,才能在理论上立住脚。

总结下本节课所学到的知识:

1)神经网络擅长处理这种在人类看来有规律,且又有大量数据证明这种规律存在,但传统编程就是无法实现的事情。

2)通过一张架构图,以职场人际关系为例,讲解了神经网络是如何识别数字验证码的。

3)了解了神经网络的通俗定义——神经网络即职场。

最后,我给大家留下三个作业:

1)请使用本章给出的领导神经网络,画出如下图数字1的识别过程?

2)结合本节课知识自己给神经网络下个定义。

3)如果识别多个数字,隐藏层领导、输出层的人数到底如何确定呢?

如果大家完成作业有任何疑问,欢迎留言进行讨论!

1
查看完整版本: 手写数字识别