1. 导读

前面我们回顾了AlexNet,AlexNet的作者指出模型的深度很重要,而VGG最大的贡献就在于对网络模型深度的研究。

VGG原论文:《Very Deep Convolutional Networks for Large-Scale Image Recognition

VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG其规律的设计、简洁可堆叠的卷积块,且在其他数据集上都有着很好的表现,从而被人们广泛应用,同时在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。

2. 网络结构

这是论文中作者给出的VGG的6种不同网络结构:

VGG-16示意图如下,整体来说整个网络可分为5个block,每个block由卷积+池化组成,然后进入3个全连接层再接softmax实现分类:

我们以VGG-16为例来解读其网络结构:

  • VGG-Block内的卷积层都是相同的结构,其中都是统一通过size为3×3的kernel size + stride1 + padding(same)实现,意味着输入和输出的尺寸一样,且卷积层可以堆叠复用。
  • MaxPool层统一的pool size=2,stride=2,起到的作用是将前面的卷积层的特征缩减一半,从224-112-56-28-14-7.
  • 输入层: 输入为224×224×3 三通道的图像。
  • Block1: 输入为224×224×3,2个卷积层分别经过64个kernel size为3x3×3的filter,stride = 1,padding=same卷积后得到shape为224×224×64;再经Max-pooling层:pool size=2,stride=2的减半池化后得到尺寸为112×112×64的池化层。
  • Block2:输入尺寸为112×112×64,2个卷积层分别经128个3×3×64的filter,stride = 1,padding=same卷积后得到shape为112×112×128;再经Max-pooling层:pool size=2,stride=2的减半池化后得到尺寸为56×56×128的池化层。
  • Block3:输入尺寸为56×56×128,3个卷积层分别经256个3×3×128的filter,stride = 1,padding=same卷积后得到shape为56×56×256;再经Max-pooling层:pool size=2,stride=2的减半池化后得到尺寸为28×28×256的池化层。
  • Block4:输入尺寸为28×28×256,3个卷积层分别经512个3×3×256的filter,stride = 1,padding=same卷积后得到shape为28×28×512;再经Max-pooling层:pool size=2,stride=2的减半池化后得到尺寸为14×14×512的池化层。
  • Block5:输入尺寸为14×14×512,3个卷积层分别经512个3×3×512的filter,stride = 1,padding=same卷积后得到shape为14×14×512;再经Max-pooling层:pool size=2,stride=2的减半池化后得到尺寸为7×7×512的池化层,该层后面还隐藏了flatten操作,通过展平得到7×7×512=25088个参数后与之后的全连接层相连。
  • FC:经过3个全连接层,神经元个数分别为4096,4096,1000。其中前两层在使用relu后还使用了Dropout对神经元随机失活,最后一层全连接层用softmax输出1000个分类。

3. 论文总结

  • 网络深度对模型分类性能有提高:作者做了实验,网络从11层19层,网络深度增加对top1和top5的错误率下降很明显。最佳模型:VGG-16

  • 多个小卷积核比单个大卷积核好:相较与AlexNet,VGG最大的改进或者说区别就是用小size的Filter代替大size的Filter。2个3x3的卷积层连接,就达到了5x5的效果,3个3x3的卷积层连接,就达到了7x7的效果;多个小卷积比单个大卷积好在两个方面:1:可以减少参数,例如使用3个3x3卷积参数个数:3(3x3xCxC),单个7x7卷积层参数个数,后者参数量大81%:7x7xCxC;2:这样做相当于进行了更多的非线性映射,可以增加网络的拟合和表达能力。

  • 删除了AlexNet中的LRN层:没有使用AlexNet中的LRN技术。这是因为后面的实验(如上图中的A和A-LRN)中证明了使用LRN对性能并没有提升作用,反而增加内存和时间消耗。

  • 图像预处理:在模型训练期间,作者所做的唯一预处理就是将输入的224×224×3通道的像素值,减去平均RGB值,为了增加数据集,和AlexNet一样,这里也采用了随机水平翻转和随机RGB色差进行数据扩增。对经过重新缩放的图片随机排序并进行随机剪裁得到固定尺寸大小为224×224的训练图像。

4. 代码实现

为了加深对VGG网络的理解,我基于pytorch框架使用了与我上一篇AlexNet博客中同样的数据集去对VGG16进行测试,其demo你可以点击这里在github上访问;

论文日记二:VGG的更多相关文章

  1. 论文选读二:Multi-Passage Machine Reading Comprehension with Cross-Passage Answer Verification

    论文选读二:Multi-Passage Machine Reading Comprehension with Cross-Passage Answer Verification 目前,阅读理解通常会给出 ...

  2. oracle入坑日记<二>认识oracle(含sqlplus基础使用)

    1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...

  3. 【LaTeX排版】LaTeX论文排版<二>

    1.目录的生成     直接使用命令\tableofcontents即可.其默认格式如下: 我们会发现,这样的格式不一定是我们所期望的.比如说,我们也希望章标题与页码之间也有点连线,并且也希望将致谢. ...

  4. Linux学习日记(二)

    在linux上运行.Net程序 并安装Linux网站 一.环境 ubuntu14.10(桌面版 官网下载的最新版) jexus5.6.3 正式版 MonoDevloper (安装完后里面有个Ubunt ...

  5. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  6. 转:Google论文之二----Google文件系统(GFS)翻译学习

    文章来自于:http://www.cnblogs.com/geekma/archive/2013/06/09/3128372.html 摘要 我们设计并实现了Google文件系统,它是一个可扩展的分布 ...

  7. Linux管理日记(二)

    14  启动内网端口转发 ### 2. 查看IP以及网卡信息 # 可以发现, eth0 的地址 inet addr:10.144.7.195, 此为内网网卡 # 公网网卡, eth1 的地址 inet ...

  8. UnderWater+SDN论文之二

    ---- Software-defined underwater acoustic networking platform and its applications source: Ad Hoc Ne ...

  9. PS日记二(调色:色阶,曲线,色相/饱和度,色彩平衡,蒙板)

    基础知识一:在PS操作中为什么要复制图层(ctrl+J)? 答:复制图层主要是为了 备份原图层,在副本中进行操作 如果说你副本弄坏了,还有原来的PS复制图层一方面是保全原图.二是因为图层是ps操作的基 ...

  10. Python学习日记(二十八) hashlib模块、configparse模块、logging模块

    hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...

随机推荐

  1. ASP.NET Core - 缓存之内存缓存(下)

    话接上篇 [ASP.NET Core - 缓存之内存缓存(上)],所以这里的目录从 2.4 开始. 2.4 MemoryCacheEntryOptions MemoryCacheEntryOption ...

  2. C# 从0到实战 lambda表达式和Expression-bodied表达式

    什么是lambda表达式(λ表达式) 用过其他函数式语言的人可能对闭包和惰性计算很熟悉,没有用过的人也多多少少的听说过Lambda表达式.那么到底什么是lambda表达式呢?按我的看法是创建一个匿名的 ...

  3. C# 信号锁SemaphoreSlim

    关于锁,我们经常会使用lock object对象,进行资源访问的限制. 但,lock是有限制的,无法添加异步方法.编译器会报错. 下面推荐另一个类SemaphoreSlim,这是信号量的一个使用类.先 ...

  4. 使用ChatGPT4协助完成读取文件中不同字的数量

    使用ChatGPT4识别:用java读取文件中不同字的个数. 解析:该程序将读取名为"file.txt"的文件,并计算文件中每个不同字的出现次数.它使用一些字符串操作来清理单词,并 ...

  5. JavaWeb之day02css与js

    目录: 1.CSS概述和与HTML的结合方式(四种)(*******) 2.CSS的基本选择器(******) 3.CSS的扩展选择器(了解) 4.CSS的盒子模型(了解) 5.CSS的布局(浮动)( ...

  6. 2023-04-04:使用 Golang 和 ffmpeg-go 库实现 demuxing_decoding.c,轻松掌握音视频分离解码技巧。

    2023-04-04:使用 Golang 和 ffmpeg-go 库实现 demuxing_decoding.c,轻松掌握音视频分离解码技巧. 答案2023-04-05: 使用github/moonf ...

  7. 2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合。 返回有几个回文子串。 来

    2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合. 返回有几个回文子串 ...

  8. 2022-02-17:寻找最近的回文数。 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输

    2022-02-17:寻找最近的回文数. 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身).如果不止一个,返回较小的那个. "最近的"定义为两个整数差的绝对值最 ...

  9. Structured Streaming 的异常处理 【Concurrent update to the log. Multiple streaming jobs detected】

    目录 异常信息 一.异常表象原因 1.异常源码: 2.打个断点 二.解决方案 1.可以通过代码指定各分区的开始offset 2.不删除而是更改checkpoint offset下的批次文件 三.异常背 ...

  10. 为什么有了 HTTP 还要 RPC

    哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用.在分布式架构下,为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用 而这时候就需要一种协议来支持远程过程调用,以便实现 ...