pytorch入门攻略及项目实战之卷积神经网络进行验证码识别

文章目录

一.前言

二.知识储备(基于个人理解)

三.爬取验证码图片

四.数据处理

五.定义、训练、测试神经网络

六.可视化处理与后续应用

七.卷积神经网络模块源代码

一.前言

疫情仍然严重,继写完上一篇博客后我也从零开始学习神经网络,真是绕了很多弯路啊。。这网上资料多归多,有用的属实难找,再加上之前忙美赛,转眼就隔了两周才有进展,这里非常想把自己从一个什么都不懂的小白一步步成长到可以自己定义、训练神经网络的大白之路分享给所有想要入门的伙伴们。如果大家看完这一篇也能够自己进行实践、操作,那么我将感到十分满足~
还有点做这个的心路历程,之前写完爬虫我是想实现自动登陆微人大(我是人大的学生),奈何它有个验证码,我用了手动输入的方法,但觉得太low;用了调用打码平台api的方法,但要交钱;用了tesserocr识别,但准确率太低,因此决定自己整一手机器学习,专门识别微人大的验证码~这就踏上了不归路hhh
再说点题外话,我想在前言里把自己这个假期自学python以及上学期有过一段自己用cocos creator编写游戏的感受总结出3点分享给大家:

1.任务驱动型学习是最有效的。

现在知识太多,我们学习时无法把所有点全都学会,长时间的、漫无目的地研读用户手册无疑是效率最低的做法;我们最好先明确学会了这个软件(语言)后要完成的项目,这样无论是搜索资料、进行学习都会变得容易许多,也更容易获得成就感。

2.我们都站在巨人的肩膀上,原理层面的知识,根据个人需求和时间预算进行深挖。

刚开始学习神经网络时,我甚至连卷积神经网络和BP神经网络都没有分清,甚至弄混了两者的权重矩阵,就直接开始钻研后向传播算法的证明过程,结果什么也没搞懂不说(因为我根本不知道它用在哪个过程),还浪费了很多时间;最后才发现原来pytorch中人家都有封装好的方法进行后向传播。。。吐了

因此,搞清学习某个东西时自己对结果的定位,到底是要全面了解、滴水不漏还是用它完成某件事,如果是后者,请不要浪费太多时间去探寻“为什么”,而是去弄明白"怎么做“。

3.不要过早优化,先试一试再说。

我们初学新的事物时,千万别想一步登天,看到不懂的地方,搞清楚其使用方法后,不要想是不是还有更简单的方法,而是先自己试一试,如果之后了解到更优方法再改,否则就是思而不学则殆

4.闲话说完啦,我们开始吧!还没有安装pytorch的宝贝们可以看看上一篇博客

二.知识储备

这里先贴出一些优质博客:

1.首先我们需要了解,什么是机器学习和深度学习

就我现在的理解,无论是机器学习还是深度学习,其核心只有一个:函数拟合。对于二维平面上离散的点
( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) (x_1,y_1),(x_2,y_2),...,(x_n,y_n) (x1,y1),(x2,y2),...,(xn,yn)
我们可以用数学方法进行二次回归、多项式回归等方法将其拟合在一个直线/曲线上,但是,对于n维空间中的点 ( x 1 ( 1 ) , x 2 ( 1 ) , . . . x n ( 1 ) , y ( 1 ) ) , ( x 1 ( 2 ) , x 2 ( 2 ) , . . . x n ( 2 ) , y ( 2 ) ) , . . . , ( x 1 ( n ) , x 2 ( n ) , . . . x n ( n ) , y ( n ) ) (x_1^{(1)},x_2^{(1)},...x_n^{(1)},y^{(1)}),(x_1^{(2)},x_2^{(2)},...x_n^{(2)},y^{(2)}),...,(x_1^{(n)},x_2^{(n)},...x_n^{(n)},y^{(n)}) (x1(1),x2(1),...xn(1),y(1)),(x1(2),x2(2),...xn(2),y(2)),...,(x1(n),x2(n),...xn(n),y(n)),我们是难用数学直观的进行计算的。但是计算机强大的运算能力可以通过复杂的算法(一般就是梯度下降)来拟合出一个合适的函数,达到用预测值逼近真实值的目的。

对于我们接下来要进行的验证码识别,其拟合的目的就是让计算机识别到验证码图片的特征,将其分为26*4类,也就是让函数在n维空间的不同位置有着26*4种不同的输出。这个在训练网络的部分会细讲

2.什么是BP神经网络(落后)什么是卷积神经网络(重要,必须得看)利用pytorch封装好的方法搭建简单的神经网络(三篇连在一起,主要用来参考,零基础可以先动手实践),以及如何计算图片经过卷积层、池化层后的尺寸(重要)

个人见解:BP神经网络其实就是卷积神经网络的全连接层,且现在常用的是卷积神经网络,由于本篇博客涉及的验证码识别项目运用的就是卷积神经网络,在此我也只对其进行详细的介绍。

最开始我们必须明确,我们传入卷积神经网络的是图片转化而成的tensor!!但为了方便理解,我们可以认为传入网络的就是一张张图片。

接下来,卷积神经网络中有几个重要的参数,我想通过介绍他们的方式,让大家对卷积神经网络有更直观的了解:

  • e_poch:

    首先,我们把让计算机进行”学习“的过程称为训练,联想到训练动物进行杂技表演,只练一次是不会达到目的的,因此我们会训练很多次,每一次训练,称为一次e_poch。
    具体进行几轮训练,需要我们人为地进行规定,一般根据经验和模型的反馈进行调整
  • batch_size:

    计算机的计算能力很强,我们一次只传入一张图片实在太过寒酸,计算机资源无法得到有效利用。因此,我们每次向网络中传入batch_size张图片,这样不仅更大的利用计算机的资源,还让计算机更好地对图像特征进行分析。
    其具体数值地大小,需要我们人为地进行设置,一般根据经验和模型的反馈进行调整
  • 宽度和高度:

    我们进行图片识别时,传入神经网络的是图片,既然是图片,那么就会有尺寸,即为图片的宽度和高度,这其实就是图片的像素大小,我们右键图片,在属性中的详细信息就可以查看,如下图:
    在这里插入图片描述
    针对这张图片,我们将其理解成由100*38个像素点构成的,每一个点上都包含着图片的信息(主要是颜色),这个信息就是图片的特征,我们神经网络的自变量即为这个特征的倍数,卷积神经网络中卷积、池化、全连接均涉及特征维度的运算,即涉及对尺寸的修改。
  • channels:

    翻译为通道数,我们进行图片识别时,传入神经网络的图片是 ( R , G , B ) (R,G,B) (R,G,B)三通道的,我将其理解为三张图片叠在一起
    只有卷积运算涉及通道层面,卷积运算通过卷积核与图片做Hadamard乘积,将图片的通道数增加,提升计算机对图片特征的辨识能力。因此,对于我们的项目,卷积神经网络第一层卷积的in_channel,即输入的通道数一定为3
    out_channel即为经过这一层卷积运算希望得到的通道数,这个参数只能靠经验和模型的反馈进行设置;同时,第 n − 1 n-1 n1 层卷积的out_channel一定等于第 n n n 层的in_channel
  • kernel_size

    意为卷积(池化)核的尺寸,通常设置为一个数是因为默认卷积核为方阵,我们也可以指定其为 ( M ∗ N ) (M*N) (MN)的矩阵。
    其具体数值地大小,需要我们人为地进行设置,一般根据经验和模型的反馈进行调整
  • stride

    意为卷积(池化)核每进行一次运算后移动的步长。
    其具体数值地大小,需要我们人为地进行设置,一般根据经验和模型的反馈进行调整
  • padding

    意为在特征图边框补零的个数,通常设置为一个数是默认各边补一样多个数。
    其具体数值地大小,需要我们人为地进行设置,一般根据经验和模型的反馈进行调整
  • 经历卷积、池化后图片的尺寸计算公式:

    n ′ =
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值