基于VGG深度学习神经网络的猫狗数据集分类

2023-11-02

摘要:VGG网络是由牛津大学视觉几何组完成的基于深度卷积神经网络的大规模图像识别架构,该网络参考了AlexNet、ZFNet、OverFeat等经典的网络架构,从而得出的。这个架构参加了ILSVRC-2014比赛,取得了定位冠军、分类亚军的成绩,因其优异的泛化性能而被广泛的应用于迁移学习中,还成为了诸多更深层次网络的基础架构,鉴于以上的表现,该团队开源了VGGG-16模型和VGG-19模型。VGG的出现。VGG的出现使小卷积核的应用正式走入大众的视野,而且开启了神将网络向深度卷积模型时代的发展。在本文中我将VGG模型应用到猫狗数据集的分类上,

一、 引言

大型图片库的开源,高性能计算系统的出现,对深度视觉识别架构的发展起到了重要作用,促进了卷积神经网络在大规模图片和视频识别中取得的重大成功。随着深度神经网络的发展,越来越多的人尝试着改进Krizhevsky等人在2012年提出的架构,以得到更优异的性能。例如,在2013年ImageNet大赛中,性能最好的改进方案之一—在第一个卷积层中使用较小的接受域窗口以及较小的步长,另一种改进方案是在整幅图片以及多个尺寸上多次训练和测试网络。在VGG中,该团队着眼于另一个方向—深度。因此VGG这篇文章中固定了架构的其他参数,并且通过添加卷积层稳定地增加网络深度。在较小地3×3卷积核的帮助下,这样的想法变得可行。
本文根据VGG团队在定会上的论文以及开源的两个网络架构入手,从网络设置、图片类的训练及评估细节、在ILSVRC比赛中网络的不同设置比较、VGG迁移模型在猫狗数据集上的应用分析等五个方面介绍我对于VGG的认识。

二、 卷积神经网络的设置

VGG论文的主要目的是衡量卷积深度对于网络的影响,因此他每层的设置都如AlexNet中的设计原则相同。
2.1 架构
在整个训练中,卷积神经网络的输入为固定的224×224的RGB图片。所做的唯一的预处理是对每个像素减去ImageNet训练集中RGB的平均值。图片通过一系列3×3卷积核的卷积层(主要是用来获取上下左右以及中心的最小尺寸),在其中一种配置中,它也用到了1×1卷积核,1×1可以看作是输入通道的线性变换(其后会接非线性的的变换)。卷积滑动的步长固定为1,卷积层的填充模式为保留原始的空间分辨率。空间池化包含五个最大池化层,接在部分卷积层的后面(而非所有卷积后都接)。最大池化使用2×2的窗口,滑动步长为2.
在一系列卷积层的后面,接着三个全连接层(FC层):前两个fc层含有4096个通道,第三个fc层用来给ILSVRC数据集进行分类,因此有1000个通道(即就是分成1000个类)。最后一层使用Softmax作为激活函数。全连接层的设置和所欲网络一致。
所有隐藏层都使用Relu非线性激活函数,当然在除了深度,VGG与AlexNet另一个不同就是,VGG没有LRN—局部响应标准化,因为经过该团队的论证,LPN并不能提高网络性能,反而会曾加内存消耗和时间复杂度。

2.2 设置
改网络所评估的卷积神经网络在下表1中列出,每列一个架构。在下面,我们沿用论文称呼他们为A-E。所有架构的配置都遵循这着2.1所描述的通用设计,唯有深度不同。A网络有11层(8卷积3全连接)到E网络19层(16卷积3全连接),卷积层的宽度较小,从第一层的64开始,每个最大池化增加一倍,直到最后的512。网络架构如下:
在这里插入图片描述
参数量:
在这里插入图片描述
论文中指出的是尽管VGG系列更深了,但是却比之前更浅而卷积层更宽接受域更广的网络权重数目大。
在这里插入图片描述
2.3 特点
与本次大赛的其他网络不同,VGG在第一个卷积层没有使用大的接收域(eg.11×11卷积核,滑动步长为4;或者7×7卷积核,滑动步长为2)。在VGG系类架构中,全部采用的是3×3小卷积核,步长为1(与每个像素都进行卷积)。可以知道的是:两个3×3卷积核相当于一个5×5卷积,三个想当于7×7。小卷积核的优点:(1)相当于使用了三个非线性层替代7×7的一个,(文章中说这样使决策函数更具区分性,而我的理解使增加非线性,拟合性更好,从而有更好的性能)。(2)使权重参数大幅减少,eg:[3(33cc)]/(77cc)=55.1%即相当于替换后的参数只有原来参数的55.1%。
1×1的应用,论文也说是一种增加非线性因素的方式,不影响卷积层接受域。个人理解应该是1×1和利用3×3替换一样,都是增加了激活函数,使网络非线性增加。

三、 分类框架

在大概讲完VGG的网络设置细节后,现在开始描述VGG卷积神经网络的训练和评估.
3.1 训练
VGG的训练过程也与AlexNet有着极其相似,甚至可以说是一样的。在改网络中使用了包含动量的小批量梯度下降做多项式逻辑回归的优化器来对模型进行训练。批次大小为256,动量为0.9,权值衰减(L2惩罚因子设置为5*10^-4)和对前两个全连接层进行Dropout(概率为0.5)以实现正则化。学习率初始化为0.01。当验证集准确率不提时,学习率除以10。
在该文章的训练过程中,学习率衰减了三次,训练次数为为370K(迭代47次),与AlexNet相比,是有比较大的提升的。究其原因,该文章认为是:(1)深度以及更小的滤波器数量增强了正则化;(2)某些层执行了预初始化。我个人认为还应考虑到计算机性能的提升。
在训练的过程中,文章中还使用了一个比较节省的方法,即在层数较少的网络上进行训练,然后获得参数结果,再将获得的权重作为更深层次网络的初始化值来使用;和在多尺度训练时,先进行单一的尺度训练,得到的权重作为多尺度的训练。在文章中这个方法获得了比较好的效果。

四、 测试

4.1测试技巧
测试时,为了能够更好的测试网络的性能,文章采用了多尺度测试、Dense测试、及Multi-crop测试。
多尺度测试,即使是利用单一尺寸图片训练的模型,文章在进行测试时采用了输入图片尺度扰动法,即:图片等比例缩放至最短边为Q,设置三个Q,对图片进行预测,取平均,方法1 当S为固定值时:Q = [S-32, S, S+32];方法2 当S为随机值时:Q = (S_min, 0.5*(S_min + S_max), S_max)。
稠密测试(Dense test):将FC层转换为卷积操作,变为全卷积网络,实现任意尺寸图片输入:
在这里插入图片描述
在这里插入图片描述
Multi-Crop测试:借鉴AlexNet与GoogLeNet,对图片进行Multi-crop,裁剪大小为224224,并水平翻转1张图,缩放至3种尺寸,然后每种尺寸裁剪出50张图片;50 = 55*2。

实验结果在此省略,有兴趣的同学可以自行阅读进行对比。

五、 VGG在猫狗数据集上的迁移学习

5.1 猫狗数据集
猫狗数据集中包含了25000张图片,其中训练集2250(0.9)张,测试集2500(0.1)张。该数据集是Kaggle中一个比赛提供的,主要为各种场景下的猫狗图片。选择此数据集,是因为只需将结果分为两类,分类数目不多;其次是数据集大小合适,便于我们作为平常的实验使用。
5.2 VGG在猫狗数据集上训练
在这个迁移训练中,使用的是基于VGG-16的在ImageNet数据集上的预训练模型,这样可以减少我本人的计算开销和时间的花费。在超参数的设置上:
MAX_EPOCH = 3
BATCH_SIZE = 6 电脑内存不足,只能选择我电脑允许的最大Epoch和Batch_size
LR = 0.001
log_interval = 2 打印当前训练情况
val_interval = 1 在多少个epoch之运行验证集
classes = 2 类别数
start_epoch = -1 起始epoch
lr_decay_step = 1 学习率经过多少个epoch修改一次

在进行了一个epoch后电脑因为内存不足而停止训练。结果如下:
Training: Iteration[3750/3750] Loss: 0.0107 Acc:96.91% lr:0.001

六、 论文总结

6.1 关键点&创新点
堆叠小卷积核,加深网络
训练阶段,尺度扰动
测试阶段,多尺度及Dense+Multi crop

6.2 启发点
1.采用小卷积核获取高精度
2.采用多尺度及稠密测试获得高精度
3.1*1卷积可认为是线性变换,同时增加非线性层
4.填充大小准则:保持卷积后特征图分辨率不变
5.LRN对精度无提升
6.Xavier初始化可达到较好的效果
7.S远大于224,图片可能仅包含物体的一部分
8. 大尺度模型采用小尺度模型初始化,可加快收敛
9. 物体尺寸不一,因此采用多尺度训练,可以提高精度
10. multi crop 存在重复计算,因而低效
11. multi crop可看成dense的补充,因为它们边界处理有所不同
12.小而深的卷积网络优于大而浅的卷积网络
13.尺度扰动对训练和测试阶段有帮助

声明:
本文仅作为结果呈现,想要交流具体步骤及实现方法的请私戳。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于VGG深度学习神经网络的猫狗数据集分类 的相关文章

随机推荐

  • vmware 虚拟机开机自启动脚本

    1 建立一个txt文件 D VMware VMware Workstation vmrun exe T ws start I Documents Virtual Machines centos centos vmx nogui 注意 如果路
  • Python学习之爬取网页图片(单张)

    import requests import os os 库是Python标准库 包含几百个函数 常用的有路径操作 进程管理 环境参数等 root D pictures url input 请输入图片链接 让用户输入图片链接 path ro
  • 【JVM】JVM内存模型(详细)

    目录 一 JVM概述 1 jvm简介 2 jvm作用 3 jvm的内存模型 二 类加载器 1 类加载器的作用 2 加载器的类型 3 双亲委派机制的运行过程 4 双亲委派机制优缺点 5 为什么要破坏双亲委派机制 6 破坏双亲委派机制的方式 三
  • 函数调用堆栈的过程

    函数在进行调用时会产生开栈和清栈的操作 那么就来介绍一下函数调用堆栈的过程吧 首先 利用一个小例子来研究这个过程 include
  • Android禁止view上下滑动,Android RecyclerView禁止滑动

    在开发时 数组返回数目很少 需求要求不能左右滑动 下面是一种解决方案 1 RecyclerView 为垂直状态 VERTICAL 下 LinearLayoutManager layoutManager new LinearLayoutMan
  • 1929:【04NOIP普及组】火星人

    题干 这道题有好多废话 不过和全排列非常像 全排列题目 所以这道题数字的大小顺序与全排列的默认顺序一模一样 全排列的代码 在这里 本题就是一次次地调用全排列 不愿意麻烦的 就是我 可以用STL 非常方便 代码 100分 include
  • Stream:findFirst()高效简洁遍历集合中的一个元素

    业务开发中会运用到很多的List
  • sonarqube项目按权限分配

    一 创建用户 进入sornarqube的配置中心 选择权限菜单下的用户菜单 然后点击Create User按钮 只要输入登录名 用户名与密码保存后就可以创建一个新用户 二 创建组 选择权限下的群组菜单进入用户组管理页面 点击Create G
  • 时序数据交叉验证方法与python实现

    文章目录 传统N折交叉验证方法 时序数据交叉验证方法 方法1 窗口拆分 方法2 带间隔的窗口拆分 方法3 拓展窗口切分 时序交叉验证python复现 传统N折交叉验证方法 传统的N折交叉验证示意图如下图所示 时序数据交叉验证方法 由于时间序
  • 谨慎对待Go语言中对interface的nil判断

    谨慎对待Go语言中对interface的nil判断 在进行Go语言编程中 我们会看见诸如if err nil 或者if err nil 之类的判断 这跟go语言的错误处理哲学 计划失败而非成功 及早失败 有关 大多数情况下 我们对一个err
  • StringRedisTemplate运行NullPointerException的完全解决

    SpringBoot在使用Redis时出现StringRedisTemplate运行NullPointerException的完全解决 RedisTemplate运行NullPointerException的完全解决 三种解决方法 第一种
  • STM之SD卡

    SD卡基本函数 SPI InitTypeDef结构体 SPI 初始化结构体 1 SD Lowlevel Init 该函数初始化SPI相关外围时钟 配置GPIO引脚 调用SPI Init 初始化SPI InitStructre结构体 gt S
  • Linux下如何安装Anaconda、修改环境变量以及管理环境

    Linux下AI环境的搭建 Anaconda篇 1 第一步 安装anaconda 2 第二步 更改 调整系统环境PATH 3 第三步 创建适当的虚拟 python pip 工作区 3 第四步 如何使用conda来管理不同环境 1 第一步 安
  • java获取客户端操作系统_根据User-Agent,获得客户端浏览器和操作系统的信息

    碰到取客户端浏览器和操作系统信息的问题 网上找了很久 大多都是在页面中嵌入JS实现的 无法满足我的要求 所以 就自己写了个方法 可以在servlet中取到 我是根据每个浏览器User Agent的特征 来判断的 在windows xp中已测
  • 汇编实现排序——希尔排序

    希尔排序是把记录按下标的一定增量分组 对每组使用直接插入排序算法排序 随着增量逐渐减少 每组包含的关键词越来越多 当增量减至1时 整个文件恰被分成一组 算法便终止 以下是汇编实现的代码 S0 SEGMENT STACK DW 20 DUP
  • RabbitMQ学习(四)——高级特性

    RabbitMQ高级特性 1 1 消息的可靠投递 1 1 1 消息发送端 在使用RabbitMQ的时候 作为消息发送方式希望杜绝任何消息丢失或者投递失败的场景 RabbitMQ为我们提供了两种方式用来控制消息的投递可靠性模式 confirm
  • IDEA断点调试技巧,多张动图包教包会。

    文章目录 一 怎么开启断点调试 二 调试界面咋那么多按钮 1 返回断点位置 2 步过 3 步入 4 5 强制步入 步出 6 回退断点 7 断点跳到光标处 8 表达式计算 9 恢复程序 10 停止程序 11 查看所有断点 12 禁用断点 13
  • vs2017community进行DirectX开发_问题小节

    一 下载并安装vs及DirectX 1 vs版本 vs2017community 免费的 百度就有 2 我下载的DirectX版本 DXSDK Jun10 链接https pan baidu com s 1w7np5N E6QYqJXIr0
  • 微信小程序年月日时分选择器的实现

  • 基于VGG深度学习神经网络的猫狗数据集分类

    摘要 VGG网络是由牛津大学视觉几何组完成的基于深度卷积神经网络的大规模图像识别架构 该网络参考了AlexNet ZFNet OverFeat等经典的网络架构 从而得出的 这个架构参加了ILSVRC 2014比赛 取得了定位冠军 分类亚军的