vlambda博客
学习文章列表

基于Mathematica神经网络的验证码识别

    人工神经网络(英语:Artificial Neural Network,ANN),简称神经网络(Neural Network,NN)或类神经网络,在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统,通俗的讲就是具备学习功能。现代神经网络是一种非线性统计性数据建模工具,神经网络通常是通过一个基于数学统计学类型的学习方法(Learning Method)得以优化,所以也是数学统计学方法的一种实际应用,通过统计学的标准数学方法我们能够得到大量的可以用函数来表达的局部结构空间,另一方面在人工智能学的人工感知领域,我们通过数学统计学的应用可以来做人工感知方面的决定问题(也就是说通过统计学的方法,人工神经网络能够类似人一样具有简单的决定能力和简单的判断能力),这种方法比起正式的逻辑学推理演算更具有优势。

目前存在很多成熟的神经网络框架,比如Tensorflow、PyTorch、Keras、MXNet还有百度的paddle,matlab也有相对应的工具箱,而作为同是“3m”之一的Mathematica自然也是不甘于落后,于2016年引入相关的接口,并在2020年进行了主要的更新,本文假定读者已经拥有了深度学习的基础知识,将利用mathematica软件提供的接口来解决一类简单的验证码识别任务,以此来引导读者对mathematica的深度学习工具有一个大致的了解,希望能对大家有所启发。

 

数据集准备

目前许多网站的人机识别机制还是如下图的验证码形式,本体是由26个字母和10个数字组合而成再加以随机变换和噪声干扰的四个字符图片。这种人机验证的方式较为常用,在爬虫时我们可能经常遇到这种验证码,除了使用专业打码平台提供的接口外,我们也可以尝试自己构造人工神经网络来解决。

基于Mathematica神经网络的验证码识别基于Mathematica神经网络的验证码识别

考虑到带标签数据集的获取难度,我们可以直接利用Python的CAPTCHA库来直接生成验证码的数据集,这里总共生成了60000张图片作为这次训练和测试的数据,每张图片的分辨率为140*80并同时导出了图片对应的正确标签。

基于Mathematica神经网络的验证码识别

基于Mathematica神经网络的验证码识别

有了数据集后我们需要在mathematica里导入数据集并进行相应处理,首先将60000数据集55200训练集和4800测试集,为了方便没有引入验证集,并将这些数据按找数据和标签一一对应,这里采用的方法是分别识别一张图片的四个字符,但是为了简化过程没有对图片进行分割,这将会极大的影响识别的效果。同时值得注意的是在mathematica里同时导入所有数据将占用很大的内存空间。我们需要利用File函数来制作生成器函数,这样可以极大的节约资源。我们处理好的数据集如下图所示。

基于Mathematica神经网络的验证码识别

基于Mathematica神经网络的验证码识别

构建卷积神经网络并训练

在处理好数据集后,我们可以着手神经网络的构建,mathematica的神经网络是动态图结构,可以用Netchain和Netgraph方便的添加网络层以及实现层与层之间的连接,与keras框架十分相似,图片识别任务一般使用卷积神经网络就能有很好的效果,我们可以照搬已有的网络架构例如VGG等,这种架构有着很好的性能,这里我使用的是改动后的架构,如下图所示,加入了批归一化和drop层来防止梯度爆炸和过拟合。最后训练采用的损失函数是分类任务常用的交叉信息熵和softmax,训练优化方法是“adam”,batchsize是32,训练在笔记本的GPU上进行的,可以直接设置Nettrain里的TargetDevice->GPU。

 

基于Mathematica神经网络的验证码识别

基于Mathematica神经网络的验证码识别基于Mathematica神经网络的验证码识别


结果分析

 

原本设置的是训练所有是数据60轮,但考虑到时间成本在第3轮时就停止了训练,用测试集检验结果发现有87.4的准确率,部分结果如下图所示。在训练完成后我们可以将模型导出成wlnet文件保存。我们从结果可以发现主要的识别错误发生在一些难以区分的字符数字,比如0和‘o’、1和’I’,而另一方面我们并没有对数据进行字符分割,这也是降低准确率的原因之一,除此之外我们还能加大训练次数和动态调节学习率参数,这样增加时间成本也能带来准确率的提升。总而言之这也算是一个相对不错的结果,通过这个例子我们能够了解mathematica在深度学习领域的能力,对于熟悉wolfram语言的工作者,使用wolfram提供的深度学习接口来完成一些任务似乎也是一个不错的选择,希望这个例子能给大家一些启发。