首页 > 试题

猫狗大战2011

更新时间:2022-12-08 20:19:58 阅读: 评论:0

快手上电焊培训是真的吗-k相对原子质量


2022年12月8日发(作者:金秋时节)

Keras深度学习之猫狗⼤战

项⽬地址和代码:

项⽬详细报告:

keras版本:2.1.5

1.问题定义和数据集获取:

属于计算机视觉领域中的图像分类问题。图像分类的过程⾮常明确:给定已经标记的数据集,提取特征,训练得到分类器。项⽬使⽤

Kaggle竞赛提供的数据集,任务是对给定的猫和狗的图⽚进⾏分类,因此是⼆分类问题(BinaryClassification)。

项⽬要解决的问题是使⽤12500张猫和12500张狗的图⽚作为测试集,训练⼀个合适的模型,能够在给定的12500张未见过的图像

中分辨猫和狗。在机器学习领域,⽤于分类的策略,包括K均值聚类、⽀持向量机等,均能够⽤于处理该⼆分类问题。但在图像分类领域,

神经⽹络技术具有更加明显的优势,特别是深度卷积神经⽹络,已成功地应⽤于图像识别领域。

2.选择度量成功的标准(损失函数):

分类准确度(accuracy)和代价函数(CostFunction)是常⽤的分类评估指标。为了对模型进⾏更细致的评价,代价函数更加合

理。通过代价函数计算结果的值越⼩,就代表模型拟合的越好。神经⽹络的代价函数是⽤于logistic回归的⼀个泛化。Kaggle官⽹在此次竞

赛中对预测结果的评估采⽤的是对数损失函数logloss:

式中,n为测试集图像总数量;指图像类别为狗的预测概率;如果图像类别为狗,为1,如果为猫,

为0。对数损失值越⼩,预测结果越优。

3.确定评估⽅法:

三种常见的评估⽅法(evaluationprotocols):(1)维持⼀个验证集不变,这通常在数据充⾜的情况下使⽤;(2)k-折交叉验

证,数据量较少情况下;(2)迭代的k-折交叉验证,数据量较少⽽要求⾼精度模型评价时使⽤。这⾥选择第⼀种⽅法。

4.准备数据(数据预处理):

训练集包括25000张被标记的猫和狗的图⽚(各占⼀半)。测试集为12500张未被标记的图⽚,同样是猫狗图⽚各占⼀半。测试集

将作为输⼊来训练分类器。在数据⽤于训练前须进⾏预处理,使数据格式与模型相匹配。另外,数据预处理还可以应⽤数据增强技术,包括

图⽚裁剪或填充、归⼀化。如果计算资源有限,还可以将图像转化为灰度图像存储。数据集的部分图⽚如图所⽰:

训练集图像的尺⼨分布如下图所⽰。通过该散点图,我们可以⾮常直观地了解数据的构成:绝⼤部分图像的尺⼨都分布在500×500

内。猫和狗的图⽚各⾃都只有⼀张图像的尺⼨偏离正常范围内,属于异常值。于是下⼀步,我们⾸先找出这两幅图像。

这两幅图像如下⽅左图所⽰。但是,我们的图像在输⼊模型训练前,是需要进⾏数据预处理的,例如我们可能对图像进⾏尺⼨缩放或裁

剪以使输⼊数据格式统⼀。图像裁剪可能会影响模型的训练,因为它可能将图像的有⽤信息丢弃。⽽在这个项⽬中,我们将只使⽤尺⼨缩

放。缩放后的猫狗图像如下⽅右图所⽰,我们还是可以很确定地辨别出猫和狗,这说明了图像缩放这种预处理⽅式并不会对模型分类带来坏

影响,并不影响其学习,所以这对异常值是没有必要处理的!

既然图像的尺⼨对模型的训练不会带来影响或者影响甚微,那么便接着探索数据集是否存在其他异常值。由于读取图像时三个通道的值

都限制在[0,255]内,分布范围较⼩,因此图像通道值的最⼤值和最⼩值和均值都不会成为异常值。因⽽,将⽬光投向通道值的标准差,原

因是通过标准差更可能发现异常值。设想⼀下,假如⼀幅图像中通道值的标准差很⼩,这意味着图像越接近于纯⾊,则其包含的信息量越

少,越不容易⽤于提取可⽤于分类的特征。为了简化问题,将图像读取为灰度图,这样就只需要分析单通道了。

下⾯两幅图像分别是所有猫狗图像中,灰度图模型下,通道值标准差最⼩的情况。可以看到,虽然图像颜⾊⽐较单⼀,但是我们还是能

够通过⼈眼清晰地识别出猫和狗,因此这部分不存在异常值!

训练数据的异常值还有另⼀种情况,那就是类别标签标注上的异常值。寻找这些异常值最直接但同时也是最繁琐的⽅法,就是耐⼼地将

训练集⾥⾯的图⽚都⼿动检查⼀遍!但事实上我们可以⽤其他⽅式解决,那就是使⽤预处理模型来进⾏排查,这将⼤⼤减少我们的⼯作量。

基本思路是,使⽤表现最佳的预处理模型(这⾥选择在Imagenet上表现很好的Xception)对训练集的图⽚进⾏预测,给出预测正确分类概

率最⾼的n个分类。检验猫、狗标签是否在这n个类别之内,若不在则将该图⽚视为可能的异常值。

利⽤Xception预测后,使⽤decode_predictions,设置top参数为n(⼀开始均设置为30),将预测结果转化,获得预测正确分类

概率最⾼的n个分类。检验猫、狗标签是否在这n个类别之内,若不在则将图像视为可能的异常值。此时,猫狗图⽚中的可能异常值数量分别

为80和23,如下图所⽰为部分查找得到的可能异常值。

图a.猫图⽚可能异常值(Top参数均为30)

图b.狗图⽚可能异常值(Top参数均为30)

可以看到,当top参数均设置为30时,猫图⽚的异常值统计数量较狗图⽚多,同时错误统计也多。对于狗图⽚的异常值统计情况,则⼏

乎没有失误。这可能是由于imagenet在构建数据集时对狗的归类做的⽐较详细(imagenet上狗的类别有118种,⽽猫的类别只有7种)。

因此,我认为设置top参数时,应该将猫和狗分开讨论,不能⼀概⽽论。经过⼀番尝试,我将猫的top参数设置为35,狗的top参数设置为

10,最后获得的部分可能的异常值如下图所⽰,其中猫有62幅,狗有36幅。相较于完全⼿动检查⼀遍,这已经⼤⼤降低了⼯作量。

图a.猫图⽚可能异常值(Top参数均为35)

图b.狗图⽚可能异常值(Top参数均为10)

从上⾯的分析可以看到,猫狗⼤战数据集的异常值主要是标注上的异常值。在将训练数据输⼊模型训练之前,需要将这些异常数据进⾏

预处理。我将考虑⼀下处理⽅式:(1)将与主题完全⽆关的图⽚删除;(2)对于分类错误的图⽚,修改类别标注(例如本来是狗的图⽚

却标注为猫,这时候就需要将标注修改);(3)将背景复杂的图⽚进⾏裁剪。

这些异常值很难通过数据科学的⽅法(均值、平均值等)进⾏描述和发现,在处理的时候选择也只能⼿动处理。

5.设计⼀个优于随机预测的简单模型:

对于图⽚分类问题,存在⼀些分类效果很好的深度卷积⽹络,例如AlexNet、Inception,但在⼀开始,我们会先使⽤简单的分类模型

进⾏训练并观察其表现。在该项⽬中,我⾸先建⽴了如下结构的简单模型,它的分类准确性确实要明显优于随机分类:

可以看到,该简单CNN模型由若⼲个层“堆叠”⽽成,且可以分成这三部分:(1)输⼊层;(2)卷积层和池化层的组合;(3)全

连接的多层感知机分类器。在需要处理过拟合问题时通常还会引⼊dropout层。

6.设计过拟合模型:

⾃⼰从头设计CNN有时并不是⼀个好的决定,它既费时⽽且⼜不⼀定能获得优秀的表现。所以,在该项⽬将采⽤迁移学习的⽅法,其

中使⽤的⽤于finetune的预训练模型包括VGG16,ResNet50,Inceptionv3和Xception。

本项⽬中,在使⽤各个预训练模型时,都采取了同⼀个流程。⾸先,尝试使⽤特征提取⽅法。第⼀步,加载去掉顶层分类器的模型(留

下卷积层)之结构和权重,并将训练数据输⼊模型,提取特征向量;第⼆步,为卷积层添加全连接层和dropout层,输⼊上⼀步提取的特征

向量进⾏分类,观察分类结果并评价。第三步,为卷积层添加⼀个包含卷积核的顶层分类器,将加载的卷积基础层冻结(不冻结顶层分类器

的卷积核),重新编译模型。输⼊图⽚数据进⾏训练,得到⼀个训练过的顶层分类器。之后,尝试使⽤参数微调⽅法。在使⽤特征提取⼿段

时,我们已经得到了⼀个包含卷积层的顶层分类器。现在,可以将冻结的卷积层解开部分层,与顶层分类器⼀起训练。参数微调就是微调加

载的模型的部分卷积层以及新加⼊的顶层分类器的权重。

这⾥需要注意的是:为了顺利地进⾏参数微调,模型的各个层都需要以预先训练过的权重为初始值。所以,不能将随机初始化权重的全

连接层放在预训练过的卷积层之上,否则会破坏卷积层预训练获得的权重。体现在前⾯谈到的流程中,就是先使⽤特征提取⽅法训练顶层分

类器,再基于这个顶层分类器进⾏参数微调。

另外,参数微调时不会选择训练整个⽹络的权重,⽽只微调位于模型中较深的部分卷积层,这在⼀定程度上可以防⽌过拟合。在前⾯已

经提到,因为由底层卷积模块学习到的特征更具⼀般性,⽽不是抽象性。

对于VGG16模型,我⾸先尝试选择将其卷积模块的末尾3个卷积层冻结然后再进⾏参数微调,但效果并不理想。于是我⼜将冻结层扩

⼤⾄末尾4个卷积层,进⾏参数微调;对于InceptionV3,选择将249层之前的层冻结;对于Resnet50,选择将168层之前的层冻结;对

于Xception,选择将126层之前的层冻结。下图所⽰表⽰了VGG16参数微调的设置⽅法,其他模型的设置原理与此类似。

7.调整模型、调整超参数:

应⽤参数微调技术时应该在⽐较低的学习率下训练,这⾥使⽤的学习率为0.00001,优化器为RMSprop。较低的学习率可以使训练过

程中保持较低的更新幅度,以防⽌破坏模型卷积层预训练的特征。

在⼀开始,我将Batchsize设置为50,但是在训练时发现模型不容易收敛,⽽且在测试集和验证集上的损失函数值波动较⼤,引⼊

Keras的回调函数EarlyStopping(EarlyStopping能够让模型在训练时根据设定的条件停⽌)时,需将patience参数设置为较⼤的值。故

后⾯将Batchsize调整为较⼤值。但Batchsize太⼤对GPU显存资源也是⼀个很⼤的负荷,最终将训练时的Batchsize调整为100。

为了应对模型过拟合问题,我使⽤了数据增强技术来训练⼀个新的⽹络,所以所有epoch中是不会有两次相同的输⼊的。但是,这些输

⼊仍然是相互关联的,因为它们来⾃有限的原始图像,数据增强并不能产⽣新的信息,⽽只能重新混合现有的信息。因此,这可能不⾜以完

全摆脱过度拟合。为了进⼀步克服过度拟合,我还将在模型中全连接层分类器的前⾯添加⼀个dropout层这是⼀种正则化⼿段,不过跟

Regularization不同的是,它是通过将训练的层中的部分神经元的输出置零来实现的。在这⾥,使⽤的Dropout参数为0.5。

但在参数微调过程中,我发现Xception很快就停⽌训练了,因为使⽤了EarlyStopping回调函数,⽽且val_acc和val_loss都呈现出模

型的性能在下降的趋势,最后参数微调效果也不理想。于是我增⼤了数据增强的幅度,重新跑了⼀遍程序,这时Xception模型依然很快就

停⽌训练,但是val_acc和val_loss却是往好的趋势变化。在这之后,我果断将EarlyStopping中的stop参数调整为较⼤的整数,从⽽增加

Xception训练的epoch数量。

所有模型的训练都在JupyterNotebook中完成。程序批量读取图⽚,并根据具体模型进⾏相应的数据预处理,包括数据增加技术。各

模型训练过程如图中所⽰,由于参数微调时的模型的顶层分类器之权重是由特征提取过程中训练过的,因此在训练的⼀开始,模型就已经表

现得⽐较好了。后三个模型在整个参数微调过程中,模型的改进幅度并不明显。最终训练得到的结果准确率已经很⾼了。

可以看到模型表现相对较优的是Xception、InceptionV3,它们在验证集上的分类准确率均⾼于99%,损失值均低于0.03。⽽

InceptionV3在验证集上的分类准确率已经达到了0.993%,logloss值为0.025左右,参数微调效果⾮常理想,和Xception⼗分接

近!ResNet50虽然也达到了不错的分类准确性,但结果却和InceptionV3想⽐却处于劣势。初步猜测是模型训练时参数设置不够合理导致

的,例如数据增强的设置,在往后的学习中会进⾏验证。VGG16的表现相对于前⾯三种模型则处于明显的劣势,毕竟VGG16相对较⽼,⽹

络结构也较浅。

8.特征融合:

使⽤预训练的模型进⾏参数微调确实⽐使⽤⾃⼰搭建的模型能够获得更⼩的损失函数值,但是训练过程还是⼗分缓慢的。在对每⼀个模

型进⾏参数微调前,我都有都尝试直接使⽤特征向量来进⾏分类,⽽且个别模型的分类结果⼗分理想,包括ResNet50、InceptionV3和

Xception。因此,尝试将提取的多个较优模型的特征进⾏组合,是⼀个⾮常可⾏的⽅案!

整个构建过程很简单。⾸先,我们选择在前⾯的训练中表现最好的三个模型ResNet50、InceptionV3和Xception作为特征融合的对

象模型。接着,先将数据输⼊各个模型中,提取特征向量并保存下来。然后,将对应同⼀个训练样本的来⾃这三个模型的三个特征向量在长

度上进⾏堆叠,最终得到共12500个维度为3×2048=6144的特征向量。

最后,构建⼀个简单的神经⽹络,输⼊上⼀步特征融合得到的特征向量集合,进⾏训练。应⽤特征融合技术构建的模型如图所⽰(这部

分代码和思路借鉴⾃杨培⽂⽼师,由衷感谢!)。

运⽤特征融合⽅法的训练曲线如下图所⽰,最终在验证集上的准确率很轻松地就达到了99.6%,val_loss也只有0.012。

本文发布于:2022-12-08 20:19:58,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/68169.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:碧绿碧绿的
下一篇:虻怎么读
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图