1.背景介绍
网络保护通常面临的一个难题就是,他应该让人能够很容易地识别,而让机器无法识别,比如验证码,可以有效地减少垃圾邮件,还能防止用户的密码被恶意**。
2.原理分析
最好的办法就是使用迁移学习,通过迁移学习,来让没有太多计算资源的人也能顺利实现深度学习中复杂模型的训练。
迁移学习
在机器学习的经典监督学习场景中,如果针对一些任务A训练一个模型,会通过提供任务A的数据和标签来进行训练,现在已经在给定的数据集上训练了一个模型A,并期望他在同一个任务和未知数据上表现良好,在另外一种情况之下,当给定一些任务B的数据和标签时,可以根据任务B来训练模型B
总结下来就是,将预训练的网络迁移过来,然后训练过程中只更新最后的全连接层部分的参数,实现最后我们自己任务的分类目的。
3. 实现方法
第一种方法就是导入预训练的卷积网路,将最后的全连接层改成我们自己设计的全连接层,然后更新整个网络的参数,最后能特别快的达到收敛,第二种方法就是锁定前面卷积层的参数,让网络训练只更新最后全连接的参数,这样可以让我们训练时间大大减少。
4.代码实现
先是可以从https://www.kaggle.com/c/dogs-vs-cats/data这边下载数据集
再通过预处理将他们分成两个文件夹。首先创建两个文件夹,一个是训练集文件夹,一个是测试集文件夹。这两个文件夹内部都有两个文件夹,一个文件夹中放狗的图片,一个文件架中放猫的图片。
在移动到相应的文件夹中。
这三行代码分别代表:提取出文件夹中所有图片的名称和分别提取出狗和猫的图片,其中调用了filter这个函数。
再把猫和狗的图片分别移动到训练集和验证集当做,。90%作为训练集,10%作为验证集,调用shutil.move()来移动图片
再开始迁移学习的模型训练
方法一
在torchvision.modele中包含了预训练的模型。
方法二
本质上和方法一是一样的,方法二会固定住卷积层的参数,只更新全连接层的参数。
先提取出模型中的参数,再将其设定为不求梯度,最后在优化器中设置需要优化的参数只有全连接层的参数。
方法三
在这个方法中,组合了多个预训练网络,都将他们的卷积层参数固定,只更新最后的全连接层的参数,相当于方法二的衍生,在每一次迭代的时候,都需要将图片前向传播,通过卷积层到全连接层最后到输出结果,接着进行反向传播更新全连接层的参数。
显示定义好特征提取的预训练网络