!有需要本项目的实验源码的可以私信博主!
摘要:随着大数据时代的到来,深度学习、数据挖掘、图像处理等已经成为了一个热门研究方向。深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。这也是深度学习在当下备受欢迎的原因之一,本实验的研究目的是自动识别猫狗类型,采用的是基于数据挖掘的猫狗自动识别技术。本实验将具有外貌复杂的猫狗图像,其中训练集下各有猫狗数据1000张,验证集下各有猫狗500张,运用卷积神经网络训练,并挑选深度学习框架 TensorFlow以及计算能力强大的 GPU,使用深度神经网络 VGG16,分别对猫狗图像进行网络训练与测试。实验显示使用 VGG16 网络模型进行识别的准确率非常高,在猫狗类型识别问题上具有突出优势。
关键词:深度学习;卷积神经网络;VGG16;二分类;图像处理;数据增强;
1 引言
当下在数据挖掘中,对数据挖掘模型进行分析和设计主要是通过对算法模型的研究来实现的,其中卷积池化方法是最基本的。数据挖掘包括的内容十分广泛,主要有: 数据分析理论、数据预测理论、数据安全理论、数据侦测理论和数据追踪理论。数据挖掘中比较有名的数据库中的知识发现,迄至目前也仍是人工智能和数据库领域的热点研究问题。研究可知,数据挖掘的含义是指从数据库的各种数据中找出潜在的、并有隐藏价值的信息的过程。数据挖掘是一种决策支持过程,并主要基于人工智能、机器学习、模式识别、统计学、数据库、可视化技术等,高度自动化地分析企业的数据,做出归纳性的推理,从中挖掘出潜在的模式,帮助决策者调整市场策略,降低风险,做出正确的决策。[1]
当下,数据挖掘已经成为一种决策支持的代名词,从传统的结构化数据再到半结构化数据,最后发展到非结构化数据,不断地从数据中探索和应用,来辅助社会实现快速高效的发展与进步。
2 实验背景与研究意义
2.1 实验背景
图像识别是计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。识别过程包括图像预处理、图像分割、特征提取和判断匹配。简单来说,图像识别就是计算机如何像人一样读懂的内容。借助图像识别技术,我们不仅可以通过搜索更快的获取信息,还可以产生一种新的与外部世界交互的方式,甚至会让外部世界更加智能的运行。百度李彦宏曾提到“全新的读图时代已经来临”,现在随着图形识别技术的不断进步,越来越多的科技公司开始涉及图形识别领域,这标志着读图时代正式到来,并且将引领我们进入更加智能的未来。图像识别技术,连接着机器和这个一无所知的世界,帮助它越发了解这个世界,并最终代替我们完成更多的任务。
无论是深度学习还是机器学习,他们起源于一个共同的载体那就是“数据挖掘”,通过数据进行发掘有效的信息,这才是最终需要转换的价值,也是实现价值关键的一部分。数据挖掘这一术语,展现了与统计、精算、长期从事预言模型的经济学家之间没有技术的重复部分。数据挖掘技术主要包含 3部分: 算法和技术; 数据; 建模能力。[2]
(1) 机器学习。机器学习是计算机科学和人工智能衍生的产物。机器学习分为 2 种学习方式: 自组织学习( 如神经网络) 和从例子中总结出规律( 如决策树) 。
(2) 统计。统计包括: 预言算法( 回归) 、抽样、基于经验的设计等,现在也开始支持数据挖掘。
(3) 决策支持系统。
(4) 数据仓库。
(5) OLAP( 联机分析处理) 、DataMart( 数据集市) 、多维数据库等将数据仓库、OLAP、数据挖掘等技术融合在一起,即构成企业决策分析环境。
2.2 研究意义
目前,正处于一个大数据时代,无论是云计算、社交网络,还是物联网、移动互联网和智慧城市,都与大数据息息相关。大数据已然成为有着特定意义的专有名词,而不只是说数据量庞大。21 世纪的新一代信息技术有了突破创新以及广泛实用性普及,例如云计算、移动互联网和物联网等,这意味着人类社会正以高速跨进大数据时代。越来越多的行业对大数据的发展与应用都抱有积极态度,而更多的用户为了提升自身的工作效率也开始去尝试或考虑如何运用大数据类的解决方案。随着数据化的逐步推进,继传统企业三大竞争策略陆续问世后,大数据已然成为企业可以运营的第四种全新战略。值得一提的是,社会只需要该项技术注重相关关系,摒弃因果。简单来讲就是,只要知道是什么就好,而不用了解其背后原因。故而传统惯例就此被颠覆,人们对现实世界的理解以及面对事物的判决思维方式也被质疑挑战,基于此将会换个层面、角度思考问题,从而对传统决策产生了极其重大的影响。因此人们就可从众多繁杂数据中提取需要的,有用的、关注的信息。这也就是数据挖掘的意义所在。
3 算法模型的工作原理
本实验已经提供好数据集,并且将数据集进行了划分和标签归类,其中一共有猫狗图像3000张,训练集中猫狗图像各占50%,一共2000张数据图像,验证集中猫狗数据各占50%,一共1000张数据图像。
3.1 VGG模型概述
实验中,给出一个 VGG 结构图,如图 1 所示。在此 过 程 中,主 要 使 用 的 是 共 有 16 层 模 型 的VGG16,该模型需要的是 224* 224* 3 维度的输入数据。VGG 模型在 2014 年的 ILSVRC 竞赛中因表现优异而荣获第二,虽然 GoogLeNet 占据了第一名的位置,但是在多个迁移学习任务的较量中,VGG模型的表现都比 GoogLeNet好。此外,VGG 模型是从图像中提取 CNN 特征的首选算法。只不过 140多兆的参数量却是其主要缺点,所需存储空间较大。综合上述分析可知,VGG 模型的研究价值很大。所以本次实验选用了 VGG16 模型。[3]
VGG是当前最流行的CNN模型之一,2014年由Simonyan和Zisserman提出,其命名来源于论文作者所在的实验室Visual Geometry Group。AlexNet模型通过构造多层网络,取得了较好的效果,但是并没有给出深度神经网络设计的方向。VGG通过使用一系列大小为3x3的小尺寸卷积核和池化层构造深度卷积神经网络,并取得了较好的效果。 VGG模型因为结构简单、应用性极强而广受研究者欢迎,尤其是它的网络结构设计方法,为构建深度神经网络提供了方向。
图 1 VGG结构图
如上图VGG16的网络结构为,VGG由5层卷积层、3层全连接层、softmax输出层构成,层与层之间使用max-pooling(最大化池)分开,所有隐层的激活单元都采用ReLU函数。具体信息如下:
(1)卷积-卷积-池化-卷积-卷积-池化-卷积-卷积-卷积-池化-卷积-卷积-卷积-池化-卷积-卷积-卷积-池化-全连接-全连接-全连接
(2)通道数分别为64,128,512,512,512,4096,4096,1000。卷积层通道数翻倍,直到512时不再增加。通道数的增加,使更多的信息被提取出来。全连接的4096是经验值,当然也可以是别的数,但是不要小于最后的类别。1000表示要分类的类别数。
(3)用池化层作为分界,VGG16共有6个块结构,每个块结构中的通道数相同。因为卷积层和全连接层都有权重系数,也被称为权重层,其中卷积层13层,全连接3层,池化层不涉及权重。所以共有13+3=16层。
(4)对于VGG16卷积神经网络而言,其13层卷积层和5层池化层负责进行特征的提取,最后的3层全连接层负责完成分类任务。
下图是VGG的网络结构示意图,有13层卷积和3层全连接层。VGG网络的设计严格使用 3 × 3的卷积层和池化层来提取特征,并在网络的最后面使用三层全连接层,将最后一层全连接层的输出作为分类的预测。 在VGG中每层卷积将使用ReLU作为激活函数,在全连接层之后添加dropout来抑制过拟合。使用小的卷积核能够有效地减少参数的个数,使得训练和测试变得更加有效。比如使用两层 3 × 3卷积层,可以得到感受野为5的特征图,而比使用 5 × 5的卷积层需要更少的参数。由于卷积核比较小,可以堆叠更多的卷积层,加深网络的深度,这对于图像分类任务来说是有利的。VGG模型的成功证明了增加网络的深度,可以更好的学习图像中的特征模式。[4]
图 2 VGG网络结构示意图
3.2 VGG内核卷
VGG使用多个较小卷积核(3x3)的卷积层代替一个卷积核较大的卷积层,一方面可以减少参数,另一方面相当于进行了更多的非线性映射,可以增加网络的拟合/表达能力。卷积层全部都是3*3的卷积核,用上图中conv3-xxx表示,xxx表示通道数。其步长为1,用padding=same填充。池化层的池化核为2*2。
图 3 卷积计算
具体的过程:
(1)输入图像尺寸为224x224x3,经64个通道为3的3x3的卷积核,步长为1,padding=same填充,卷积两次,再经ReLU激活,输出的尺寸大小为224x224x64
(2) 经max pooling(最大化池化),滤波器为2x2,步长为2,图像尺寸减半,池化后的尺寸变为112x112x64
(3)经128个3x3的卷积核,两次卷积,ReLU激活,尺寸变为112x112x128
(4)max pooling池化,尺寸变为56x56x128
(5)经256个3x3的卷积核,三次卷积,ReLU激活,尺寸变为56x56x256
(6)max pooling池化,尺寸变为28x28x256
(7)经512个3x3的卷积核,三次卷积,ReLU激活,尺寸变为28x28x512
(8)max pooling池化,尺寸变为14x14x512
(9)经512个3x3的卷积核,三次卷积,ReLU,尺寸变为14x14x512
(10)max pooling池化,尺寸变为7x7x512
(11)然后Flatten(),将数据拉平成向量,变成一维51277=25088。
(12)再经过两层1x1x4096,一层1x1x1000的全连接层(共三层),经ReLU激活
(13)最后通过softmax输出1000个预测结果
3.3 权重参数
(1)输入层有0个参数,所需存储容量为224x224x3=150k
(2)对于第一层卷积,由于输入图的通道数是3,网络必须要有通道数为3的卷积核,这样的卷积核有64个,因此总共有(3x3x3)x64 = 1728个参数。
所需存储容量为224x224x64=3.2M
计算量为:输入图像224×224×3,输出224×224×64,卷积核大小3×3。
所以Times=224×224×3x3×3×64=8.7×107
(3)池化层有0个参数,所需存储容量为 图像尺寸x图像尺寸x通道数=xxx k
(4)全连接层的权重参数数目的计算方法为:前一层节点数X本层的节点数。因此,全连接层的参数分别为:7x7x512x4096 = 1027,645,444;4096x4096 = 16,781,321;4096x1000 = 4096000
按上述步骤计算的VGG16整个网络总共所占的存储容量为24M*4bytes=96MB/image 。所有参数为138M,VGG16具有如此之大的参数数目,可以预期它具有很高的拟合能力。
VGG的特点如下:
(1)小卷积核。作者将卷积核全部替换为3x3(极少用了1x1);
(2)小池化核。相比AlexNet的3x3的池化核,VGG全部为2x2的池化核;
(3)层数更深特征图更宽。基于前两点外,由于卷积核专注于扩大通道数、池化专注于缩小宽和高,使得模型架构上更深更宽的同时,计算量的增加放缓;
(4)全连接转卷积。网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。
3.4 损失函数原理分析
损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分[5]。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下式子:
损失函数有助于优化神经网络的参数。我们的目标是通过优化神经网络的参数(权重)来最大程度地减少神经网络的损失。通过神经网络将目标(实际)值与预测值进行匹配,再经过损失函数就可以计算出损失。然后,我们使用梯度下降法来优化网络权重,以使损失最小化。
损失函数是用来告诉我们当前分类器性能好坏的评价函数,是用于指导分类器权重调整的指导性函数,通过该函数可以知道该如何改进权重系数。
在图像识别中最常用的两个损失——多类别SVM损失(合页损失hinge loss)和交叉熵损失,分别对应多类别SVM分类器和Softmax分类器。一般来说,损失函数越小,对应的模型效果就越好。
4 项目结构及过程
本实验,我通过查阅网上资料以及相关文献,并结合自己学习的知识,进行构建和实现,在学习其他算法的同时,也想着如何去优化该模型,最后得到效果最佳的模型。
并通过基本模型、数据增强模型、数据增强-特征提取模型、模型参数微调四步探索方法,对本实验进行部署和实现,最终达到实验所需的结果。
4.1 基本模型
首先导入TensorFlow下面的一些包,提前需要对安装好深度学习的环境,然后再去运行代码。我们可以生成一个可迭代对象,并对其指定数据增强的具体方式(如:旋转、翻转等)
搭建keras中的sequential模型,设置好卷积层,最大池化层,全连接层等。将划分好的训练集测试集等进行处理即将在执行其他处理前乘到整个图像上并将这个值定为0~1之间的数。自己构建相关数据集。定好图片大小,使用的模型等。定好后训练模型。设置好steps_per_epoch:生成器返回steps_per_epoch次数据时计一个epoch结束,执行下一个epoch,epoch:数据迭代的轮数,validation_data:验证集的生成器,validation_steps:当validation_data为生成器时,本参数指定验证集的生成器返回次数。
当进行模型训练的时候,往往可能错过模型的最佳临界点,即当达到最大精度的时候再进行训练,测试集的精度会下降,这时候就会出现过拟合。为了防止或减少过拟合,第二个模型采用Dropout。它的大致意思是在训练时,将神经网络某一层的单元(不包括输出层的单元)数据随机丢失一部分,实际上是等于创造出了很多新的随机样本,以增大样本量,减少特征量的方法来防止过拟合
图 4 基本模型代码
以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据。
图 5 图形变换代码
构建训练网络:
图 6 构建训练网路
图 7 相关层解释
拟合模型:
·generator:生成器函数,输出应该是形为(inputs,target)或者(inputs,targets,sample_weight)的元组,生成器会在数据集上无限循环
·steps_per_epoch: 顾名思义,每轮的步数,整数,当生成器返回 stesp_per_epoch次数据时,进入下一轮。
·epochs :整数,数据的迭代次数
·verbose:日志显示开关。0代表不输出日志,1代表输出进度条记录,2代表每轮输出一行记录
·validation_data:验证集数据.
·max_queue_size: 整数. 迭代骑最大队列数,默认为10
·workers: 最大进程数。在使用多线程时,启动进程最大数量(process-based threading)。未特别指定时,默认为1。如果指定为0,则执行主线程.
·use_multiprocessing: 布尔值。True:使用基于过程的线程
训练的准确率图像如下所示:
图 8 可视化代码
图 9 基本模型的训练集和测试集效果
图 10训练的损失函数变化图像
训练过程:
图 11 模型训练过程
我们一共迭代了5次,每次迭代一共训练100批次的数据,发现效果一般,下面我们进行进一步的优化,采用一些方法来提高识别率,提高模型的效果。
5.2 数据增强模型
数据增强是从现有的训练样本中生成更多的训练数据,其方法是利用多种能够生成可信图像的随机变换来增加(augment)样本。其目标是,模型在训练时不会两次查看完全相同的图像。这让模型能够观察到数据的更多内容,从而具有更好的泛化能力。
数据增强后生成的几张图片和原始图像均不一样,采用数据增强的方法相当于能够变向增加样本,但数据增强的使用场景还是用于图像分类中比较适合,用于其它的场景,例如字符识别,就不应该采用数据增强了,采用数据增强的训练代码如下:
图 12 数据增强代码
模型可视化:
图 13 训练过程
此时,我们将训练次数迭代到100次,模型训练了很久,最终效果如下所示:
图 14 训练集和验证集准确率
从图像上看到,增大训练次数,并没有发生过拟合,当我们把训练批次设置成200时,在测试集上的准确率可以达到85%,但是耗费的时间和资源较多。
图 15 训练的损失函数
5.3 数据增强与特征提取模型
想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络。预训练网络(pretrained network)是一个保存好的网络,之前已在大型数据集(通常是大规模图像分类任务)上训练好。如果这个原始数据集足够大且足够通用,那么预训练网络学到的特征的空间层次结构可以有效地作为视觉世界的通用模型,因此这些特征可用于各种不同的计算机视觉问题,即使这些新问题涉及的类别和原始任务完全不同。举个例子,你在 ImageNet 上训练了一个网络(其类别主要是动物和日常用品),然后将这个训练好的网络应用于某个不相干的任务,比如在图像中识别家具。这种学到的特征在不同问题之间的可移植性,是深度学习与许多早期浅层学习方法相比的重要优势,它使得深度学习对小数据问题非常有效。[6]
ImageNet 中包含许多动物类别,其中包括不同种类的猫和狗,因此可以认为它在猫狗分类问题上也能有良好的表现。
使用预训练网络有两种方法:特征提取(feature extraction)和微调模型(fine-tuning)特征提取是使用之前网络学到的表示来从新样本中提取出有趣的特征。然后将这些特征输入一个新的分类器,从头开始训练。
如前所述,用于图像分类的卷积神经网络包含两部分:首先是一系列池化层和卷积层,最后是一个密集连接分类器。第一部分叫作模型的卷积基(convolutional base)。对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基,在上面运行新数据,然后在输出上面训练一个新的分类器。
图 16 VGG特征提取
上图表示的为保持卷积基不变,改变分类器。
为什么仅重复使用卷积基?我们能否也重复使用密集连接分类器?一般来说,应该避免这么做。原因在于卷积基学到的表示可能更加通用,因此更适合重复使用。卷积神经网络的特征图表示通用概念在图像中是否存在,无论面对什么样的计算机视觉问题,这种特征图都可能很有用。但是,分类器学到的表示必然是针对于模型训练的类别,其中仅包含某个类别出现在整张图像中的概率信息。此外,密集连接层的表示不再包含物体在输入图像中的位置信息。密集连接层舍弃了空间的概念,而物体位置信息仍然由卷积特征图所描述。如果物体位置对于问题很重要,那么密集连接层的特征在很大程度上是无用的。
注意,某个卷积层提取的表示的通用性(以及可复用性)取决于该层在模型中的深度。模型中更靠近底部的层提取的是局部的、高度通用的特征图(比如视觉边缘、颜色和纹理),而更靠近顶部的层提取的是更加抽象的概念(比如“猫耳朵”或“狗眼睛”)。因此,如果你的新数据集与原始模型训练的数据集有很大差异,那么最好只使用模型的前几层来做特征提取,而不是使用整个卷积基。
图 17 特征提取部分代码
图 18 数据增强的准确率变化曲线
图 19 数据增强的损失函数变化曲线
5.4 微调模型
另一种广泛使用的模型复用方法是模型微调(fine-tuning),与特征提取互为补充。对于用于特征提取的冻结的模型基,微调是指将其顶部的几层“解冻”,并将这解冻的几层和新增加的部分(本例中是全连接分类器)联合训练。之所以叫作微调,是因为它只是略微调整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关。
冻结 VGG16的卷积基是为了能够在上面训练一个随机初始化的分类器。同理,只有上面的分类器已经训练好了,才能微调卷积基的顶部几层。如果分类器没有训练好,那么训练期间通过网络传播的误差信号会特别大,微调的几层之前学到的表示都会被破坏。因此,微调网络的步骤如下:
·在已经训练好的基网络(base network)上添加自定义网络。
·冻结基网络。
·训练所添加的部分。
·解冻基网络的一些层。
·联合训练解冻的这些层和添加的部分。
为什么不微调更多层?为什么不微调整个卷积基?
卷积基中更靠底部的层编码的是更加通用的可复用特征,而更靠顶部的层编码的是更专业化的特征。微调这些更专业化的特征更加有用,因为它们需要在你的新问题上改变用途。微调更靠底部的层,得到的回报会更少。
训练的参数越多,过拟合的风险越大。卷积基有 1500 万个参数,所以在你的小型数据集上训练这么多参数是有风险的。
图 20 模型微调效果
图 21 模型微调损失函数变化
效果还是不错的,由于我的电脑显卡不足,迭代次数,所以我将代码打包到百度飞浆平台进行运行的,最终的效果比较的好,符合我们的预期,也达到了我们的效果和学习水平。
6 总结和归纳
本次使用的是卷积神经网络,卷积神经网络有3个基本层,卷积层(卷积核),池化层,全连接层。
卷积过程是使用一个卷积核(如图中的Filter),在每层像素矩阵上不断按步长扫描下去,每次扫到的数值会和卷积核中对应位置的数进行相乘,然后相加求和,得到的值将会生成一个新的矩阵。卷积核相当于卷积操作中的一个过滤器,用于提取我们图像的特征,特征提取完后会得到一个特征图。池化操作相当于降维操作,有最大池化和平均池化。
卷积神经网络的层级结构有数据输入层,卷积计算层,激励层,池化层,全连接层。
·数据输入层:主要是对原始图像数据进行预处理,如归一化
·卷积计算层:这一层就是卷积神经网络最重要的一个层次,计算矩阵
·激励层:把卷积层输出结果做非线性映射
·池化层:池化层的最主要作用就是压缩图像。
·全连接层:两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部
用VGG16方法时发现比较简单,所以对模型进行了不断地升级和微调。VGG16具有很高的拟合能力;但同时缺点也很明显,训练时间过长,调参难度大,特别是在本地电脑进行训练的时候,差一点就把主机给烧坏了,所以最后将代码放到了百度飞浆深度学习平台进行训练。
6.1 改进与不足
本文所涉及的模型系统主要用到了数据挖掘中的图像处理理论—分类: 这是数据挖掘中最为基本和比较成熟的一个分支,着重于研究大数据的分析和图像处理问题,其基本的分析和综合方法是卷积池化。主要对于图像特征进行提取,一层层卷积、一层层池化之后,再将每层都要进行优化。最后将每个图片信息降到一维的维度。由连接层输出。本文在实际测试过程中也发现一些问题,没有预处理数据集,对一些反光、模糊等的图片识别有误差。还有理论没有很好地结合实际。同时,对于代码移植方面暴露出的问题,也要在后续研究中进一步加以完善和改进。
后续进行训练的时候,可以采取GPU进行训练,CPU速度比较慢,本次实验让我充分的感受到深度学习的强大和图像处理的魅力,希望在今后的学习生活中继续在视觉处理和模式识别领域不断地学习。
7 参考文献
[1] 王光宏,蒋平. 数据挖掘综述[J]. 同济大学学报(自然科学版), 2004(2): 246-252.
[2] 李学龙,龚海刚. 大数据系统综述[J]. 中国科学:信息科学, 2015, 45(1): 1-44.
[3] 秦川. 基于卷积神经网络的图像识别[J]. 电子技术与软件工程, 2020(1): 98-99.
[4] 冯国徽. 基于卷积神经网络VGG模型的小规模图像分类[D]. 兰州大学, 2018.
[5] 张建华,孔繁涛,吴建寨,等. 基于改进VGG卷积神经网络的棉花病害识别模型[J]. 中国农业大学学报, 2018, 23(11): 161-171.
[6] 王彬,张正平,贾明俊,等. 基于卷积神经网络VGG的猫狗识别[J]. 智能计算机与应用, 2021, 11(7): 162-165.
忆往昔岁月,独有今朝