根据卷积神经网络识别手写数字

面临各种AI模型,感觉眼花缭乱,静下心花了一周时刻读了《深度学习入门》,觉得讲的很好不得不引荐下,本来是想依照神经网络前史收拾,关键概念,怎样完成这样过程来写,写了一半感觉这样写还不如直接去看书呢,又从头依照我的了解改写一遍,希望能帮到大家。

稍稍介绍下神经网络

低配电脑也可以部署,基于卷积神经网络识别手写数字

提到神经网络大家或许会显现类似这种图,我第一次也是被这种图吓到的。假如把每条线当作电线,整个图看作一个电网或许会容易了解点,比方现在有这样的问题,我输入随机的电流经过杂乱的电网,因为每一条电线的电阻不相同,输出的电压就不相同了,根据曾经的经验我知道一些输入电流和对应的输出电压,现在想知道输入全新电流的输出电压值 。

请问这个问题你打算怎样解决呢?不或许一个一个去测电阻,毕竟电线分布的处处都是,还或许埋在地下。

最有或许的办法或许是,先给每个电线电阻估个值(为了方便后续都叫权重了),通过输入已知电流,得到输出电压(假定能够),再跟已知的做比对,假如大了或小了,就调节下权重的值,终究找到最接近的。这就能够看作是练习神经网络的过程。

可是知道仅仅到这儿就太浅了。现在我问一个基本问题,怎样调整权重能够抵达方针且最快抵达呢?

稍稍提下基本概念

卷积神经网络由许多的基本概念,可是咱们要知道这些概念不是忽然呈现的,都是为了寻觅某个问题最优解才提出来的。

回到刚刚提出的问题,怎样调整权重能够抵达方针且最快抵达呢?答案是最好能够把输出的距离最大化反馈到每个权重上,而且还要知道距离往哪个方向变最快,为了完成这个意图,聪明的数学家(数学家应该没有不聪明的吧),设计了许多函数。

比方运用经过sofeMax函数正规化之后的交叉熵差错函数作为丢失函数,能够完成把练习输出值和练习方针值的差值作为梯度传递到权重上,能够了解为当差值越大就更大的传递这个差值,差值越小就更小的传递这个差值。运用激活函数ReLUSigmoid,也是为了更好把数据改变传递到权重上。

怎样核算这个数据改变呢?

咱们知道数据改变称为导数,关于一个未知数能够当作一条直线导数能够这样表明

低配电脑也可以部署,基于卷积神经网络识别手写数字
,关于两个未知数能够当作一个平面,用梯度表明
低配电脑也可以部署,基于卷积神经网络识别手写数字
,核算梯度基本的办法是进行数值微分便是一个一个求导数,可是效率太低了,所以呈现了**差错反向传达法, **用于高效核算梯度。

后边又发现沿梯度方向更新参数,在有些状况(比方这个平面是个马鞍形状)梯度方向不是最佳方向,这时候就引进了优化办法,比方SGD、Momentum、AdaGrad、Adam等。

权重的问题算解决了,可是我练习用的数据是前史经验值,怎样保证练习出的模型能够支持预测全新数据。会不会呈现只能拟合练习用数据(过拟合) 状况,毕竟获得泛化才能才是机器学习的终究方针(泛化才能是指处理未被学习过的数据的才能)。所以就呈现Dropout办法,Dropout 是一种在学习的过程中随机删去神经元的办法,用来解决过拟合问题。

到这儿上面电路的问题就能够算解决了,可是这时候又遇到新问题,之前电流的输入,仅仅一维的数据,那么关于图片这种三维(长+宽+颜色)怎样办呢?

所以卷积神经网络就闪亮登场了,卷积神经网络主要包含卷积层和池化层。

咱们之前说神经网络运用的是全衔接层,对三维数据需要通过把数组拉平为一维数据,可是这样就丢失了重要的空间信息。卷积层能够坚持形状不变。当输入数据是图画时,卷积层会以 3 维数据的办法接纳输入数据(又名输入特征图),并同样以 3 维数据的办法输出至下一层(又名输出特征图),一起对部分特征(比方边缘、纹路)进行提取,而且每一层只对部分特征进行运算处理,大大减轻了算力压力。

池化层是从方针区域中取最大值(或者平均值)输出,会吸收输入数据的细小偏差,加强特征输出。

以上神经网络的主要概念我用比较简洁的办法串了下,实践上里边有许多魔鬼般的细节。

卷积神经网络的完成

低配电脑也可以部署,基于卷积神经网络识别手写数字

需要留意的是,以 2012 年为界,之后根据深度学习的办法一直居于首位。实践上,咱们发现 2012 年的 AlexNet 大幅降低了过错识别率。而且,此后根据深度学习的办法不断在提高识别精度。

首先介绍下VGG模型,VGG 在 2014 年的竞赛中终究获得了第 2 名的成绩,准确率为92.7%。因为 VGG 结构简单,应用性强,所以许多技术人员都喜欢运用根据VGG 的网络。

低配电脑也可以部署,基于卷积神经网络识别手写数字

VGG结构图

书中的模型是参阅VGG模型进行了改造,终究准确率到达99.35%,这儿运用的卷积层全都是 3 3 的小型滤波器,特点是随着层的加深,通道数变大,而且后边的全衔接层中运用了 Dropout 层,这个网络运用 He 初始值作为权重的初始值,根据 Adam 的最优化,激活函数运用ReLU。如下图

低配电脑也可以部署,基于卷积神经网络识别手写数字

进行手写数字识别的深度 CNN结构图

代码我收拾放在gitee.com/bigtreetime…。

模型参数约1千万,大小1M,对硬件配置要求不高,自己运用的电脑处理器是i7-8750,内存16G。实践练习时,CPU占50%左右,内存6G(包含系统运行内存在内)。

运用CPU练习的,用了4个小时。

效果展现

低配电脑也可以部署,基于卷积神经网络识别手写数字

低配电脑也可以部署,基于卷积神经网络识别手写数字

能够看到准确率在99.35%。识别到的数字为8。

低配电脑也可以部署,基于卷积神经网络识别手写数字

这个是没有识别正确的图片,能够看到这个图对人类也很有难度。