【人工智能】图像识别之小白天书——验证码篇(3)

介绍

大家好!又见面啦!不知道经过前面两篇文章的学习,是否已经可以顺利的把简单的验证码解析出来了呢?这段时间已经有不少人向我正某人拍砖了,指责我讲的内容过于基础,糊弄小孩之类的云云。入门嘛,就该当如此!步子不能走得太大,扯得慌。这一篇,我们不着急寻找困难的验证码**了。为了避免大家继续拿砖头怼我,今天我决定来一篇人工神经网络的普及文!介绍一下人工神经网络极其简单的应用。

在讲人工神经网络之前,先说一下生物神经网络:一般指生物的大脑神经元,细胞,触点等组成的网络,用于产生生物的意识,帮助生物进行思考和行动。相比之下,人工神经网络之所以有人工二字,就是人工模拟生物神经网络的行为特征,来建立一种可以模仿生物行为模式进行信息处理计算的数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。没错,其本质就是数学模型!我不知道茫茫读者中有多少人喜欢数学,反正我是不(gen)太(ben)喜(bu)欢(hui)。所以下面我的讲解中,我会尽量避开枯燥的公式,但争取做到你能理解,会使用!


【人工智能】图像识别之小白天书——验证码篇(3)

图1

图1是展示的是人类和机器人的对话,以及他们大脑的构造,我们来一一解析:

神经元

神经元是构成神经系统结构和功能的基本单位,它的本质是一个具有长突起的细胞,也是它构成了我们的生物神经网络。它的功能是接受刺激,产生兴奋并传导兴奋。

【人工智能】图像识别之小白天书——验证码篇(3)

图2 神经元及信息传输

图2上半部分就是一个完整的神经元,上部圆圆的是它的细胞,中间黑色的是细胞核。周围长了很多树突,用于接收其他神经元传递来的信息。图中间那个长长的东西叫轴突,用于把信息传送到下面的突触…上面套一节一节的东西是髓鞘,这个东西最主要的作用是能避免在信息传输过程和其他的轴突出现的电气干扰,你可以理解为这是一个线程安全的机制吧…(当然还有另外的作用,像是加速传导和引导修复)千万别小看这个小东西!如果它坏掉了,那指定是嘴歪眼斜大小便失禁!末端的突触,就是信号的发射器了,看到图中突触的地方有华丽的亮光的特效了没,那就是上面的神经元正在把兴奋地信号传递给下方的神经元!

上述这段这纯属是本人的拙见,如有专业人士,切莫过于认真!

人工神经网络

【人工智能】图像识别之小白天书——验证码篇(3)

图3 BP神经网络简单模型

我们讲解的人工神经网络是BP神经网络(Back Propagation Neural Network)。BP神经网络是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。

我用人话解释一下啊:BP网络的基本思想由两部分组成:

第一部分是样本信息正向传播并且输出结果。如图3,整个网络模型中,信息的传递从输入层(input)开始,按照正向(从左往右)一层一层的传递“信息”,每一条线代表一条连接(连接也就意味着一次传递),箭头的方向表明信息传递的方向,当某个节点接收到上一层所有节点传递而来的“信息”,就会进行一次计算,计算的结果作为本节点的输出,传递到下一层的每一个节点中。直至输出层,经过计算把最后的结果输出。图中的隐藏层只有一层,但我们的BP神经网络是多层网络,也就是说隐藏层可以有好几层。

第二部分就是误差的反向传播,更新网络中的权重。通过上面的介绍我们知道了,信息传播结束之后,输出层的每个点都会输出一个数,用这个数和我们人工给出的正确数据进行比较,也就是上篇文章我们提到过的人工打标的数据。求出误差(常用误差计算公式有均方差或交叉熵等),这时厉害了,这个误差通过某些梯度下降算法的计算后,结果会更新到每条连接中,通过每条连接给传递的参数带来一次变化,也就是更新了连接的权重,经过更新权重处理,传入下一层每个节点的数发生了细微的变化,这也直接影响到了最终输出的结果,使之下次计算出的误差变得越来越小,循环此过程使最终输出不断趋近甚至等于我们人工给出的正确数据!从而得到正确的输出。这就是一次信息正向传播,误差反向传播的过程,通过不断重复这个过程,达到了该网络自我修正,自我学习的特性。

至于传递的“信息”是什么,加的“权重”又是什么,每个节点要怎样去计算,每一层结点的数量是怎么来的?且听我下文慢慢道来。

传递的“信息”是什么

咱们先来聊聊,传递的信息是啥吧!input作为输入层,所有数据的输入都源自这里,这里完全可以理解为传入的是图片的每个像素点。比如你的图片是 10*10的长宽,那input层节点的数量就是100个,前期我们对验证码进行训练的时候就这样去做就好。以后如果我们对图像进行处理,特别是那些2000*2000的以上分辨率的图片,由于像素点过多,我们对图像进行特征提取,这样可以降低输入的维度(数量)并且提高训练的速度。后面如果涉及到再细细讲解。

这个点的灰度值传入之前,我们最好对其进行预处理,可以提高训练的速度!这边我们用一个最最简单的预处理办法,归一化。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为标量。 在多种计算中都经常用到这种方法。

我在用人话解释一下:归一化的意思就是把你将要进行处理的数据,进行统一的一次加工,加工后,相当于把所有的数据按照等比例缩小了!(这里只是泛泛而谈,最优的方案是让所有数据均值为0,方差为1,范围控在-1~1之间,在这里并不需要做的如此精确)这样能把结果限定在一个更小的范围内,方便归纳统计!我们这里可以把范围控制在0~1之间。而且还能提高你训练的收敛速度。具体怎么去操作呢?通过前几篇文章我们已经知道了灰度值的范围是0~255了,我们把每个像素点的灰度值除以255,就会得到一个0~1之间的数,这就是归一化之后的数据了,要注意,每一个像素都要进行归一化处理哦!

“权重”是什么

权重为整个模型的精妙之所在!可谓是万变之根源,训练之核心!权重的计算公式为:ΣWA+B,其中A为上一个节点的输出,W就是权重值,B为偏移量。

每次信息传递完毕之后会得到一个误差,这个误差会分配到网络中的每一个连接之中(也就是每条线),通过控制公式中W和B的变化,使每次传递的参数发生变化,来修正每次训练的输出,不断地收敛来缩小误差,真正实现自适应、自学习,这才是一个“活”的模型!理解了吧!

隐藏层和输出层的计算是什么?

这个计算,就是传说中的**函数(activation function),这个名字的含义比较抽象。他主要作用是通过计算,把特征保留并且映射出来。**函数是非线性函数,下面展示几种常用的**函数:

【人工智能】图像识别之小白天书——验证码篇(3)

图4 常用的**函数

实在是不理解?没关系!你只要理解为,这是一次计算就可以了!每一层隐藏层的**函数都是固定的,虽然说不同的隐藏层可以使用不同的**函数,但是通常来讲,很少会把各种**函数串联起来使用的。其中Relu是现在收敛最快,计算量相对较小的**函数,推荐使用。**函数几乎可以说是纯粹的数学,正某人本想单开一篇讲解**函数,但过于枯燥有违我们整体风格,等这一系列连载完再单独讲解吧!等不及想一探究竟的同学可以直接去问度娘。

看到这里,你几乎具备了关于BP神经网络所有的理论知识了,难理解吗?幸运的是,现在有很多成型的工具实现了训练模型的方法,在使用中,你几乎不需要去关心我上述讲的任何一个步骤是怎样实现的。说这么多只是希望有了理论的支持,在用的时候可以了解每一步骤的用处,知道如何正确的调参。

写到这儿正某人也是弹尽粮绝了…几乎耗尽了毕生的真气,头发更是掉了一大把!给我点时间恢复元气,下一章,咱们撸代码!


【人工智能】图像识别之小白天书——验证码篇(3)

【人工智能】图像识别之小白天书——验证码篇(3)

微信扫一扫
关注该公众号