用于大尺度图片识别的非常深的卷积网络

使用一个带有非常小的(3*3)的卷积核的结构去加深深度,该论文的一个十分重要的改进就是它将卷机网络的深度增加到了16-19层,且可以用于比较大224*224的图片当中

其最大的特点就是采用了大量卷积核尺寸为3*3的卷积层,小尺寸的卷积核可以大大减少计算量。其网络层数从11层到19层不等,主要由卷积层、池化层和全连接层组成,这一点延续了AlexNet的特点。该网络最后几层采用的是全连接层,而且全连接层的输出节点很大(4096),这种设计虽然对提升模型效果有帮助,但是会带来大量的参数量,这也是后续一些做模型加速和压缩算法关注的点,最常见的做法就是使用其他网络层比如卷积层替代这些全连接层

1.配置说明

在训练中,网络的输入大小是固定的224*224图片,对图片做的唯一预处理操作是将训练集中图片每个像素减去他们的平均RGB值。使用了3*3大小的接受域(即卷积核),从下面的图中我们也可以看出也用网络C的配置中使用了1*1大小的接受域,可以看作是一个输入channels的线性转换(后面跟着非线性函数ReLU)。stride设置为1;对于3*3接受域padding设置为1;使用了5个max-pooling层,都跟在卷积层的后面,窗口设置为2*2,stride设置为2。之后还跟着3个全卷积层,前两个有4096个channels,最后一个的输出节点数是1000,因为ImageNet数据集的类别数是1000

只有网络A-LRN带有LRN(local response normalization)归一化方法,从下面可见其并没有改善性能,而且还增加内存消耗和计算时间

有A-E 6个不同深度的网络,从网络A的11层(8个卷积层和3个全连接层)到网络E的19层(16个卷积层和3个全连接层)。网络的宽度(即通道的数量)从第一层的64,在经过一个max-pooling层后增加一倍,直到到达512层

之前的网络在第一个卷积层都是使用比较大的卷积核,如11*11且stride=4或7*7带着stride=2,这个网络使用的是3*3且stride=1的。可见两个3*3卷积层(中间没有空间池化层)等价于一个5*5层,三个卷积层等价于一个7*7层。

那么使用三个3*3卷积层替换一个7*7卷积层的好处是:

  • 使用一个ReLU函数替换了三个ReLU函数,使决策函数更具分辨力
  • 减少了参数的数量:假设三层3*3卷积层的输入和输出都是C个通道数,其参数有3*(32C2)=27C2,7*7的卷积层的参数有72C2=49C2

在网络C中添加了1*1卷积层,在不影响卷积层的接受域的情况下增加决策函数的非线性,并没有改变输入输出的channels的数量

2.分类框架

1)训练

batch size设置为256,momentum设置为0.9。正则化将weight decay(L2 penalty multiplier)设置为5*10-4,对于前两个全连接层的dropout正则化方法设置dropout ratio为0.5。学习率初始设置为10-2,并且当验证集的准确率停止上升时,lr = lr/10。总之学习率衰减了3次,学习停止在了74 epochs。所以我们推测尽管我们的网络对比2012的网络有着更多的参数和更大的深度,由于(a)更大的深度和更小的卷积核大小和(b)某一层的预初始化带来的隐含正则化效果,我们的网络只需要很少的epoch去收敛

网络权重的初始化是十分重要的,由于深度网络中梯度的不稳定性,初始化不佳会使学习陷入停滞。

为了规避这个问题,当我们训练的是如网络A这种比较浅的网络时使用的是随机初始化。然后,当训练更深层次的架构时,我们与net A一起初始化前四个卷积层和最后三个全连接层(中间的层都随机初始化)。对于预初始化的层我们不减少他们的学习率,而是在学习的过程中允许他们改变。对于随机初始化,我们是从均值为0方差为10-2的正态分布对权重进行采样的。偏置bias设置为0.

为了获得固定大小224*224的输入图片,对重置大小的训练图片进行随机剪切。为了让增加训练集,随机剪切后还进行了随机水平翻转和随机RGB颜色变换

训练图片大小的设置:

S:isotropically-rescaled训练图片的最小边,称其为训练尺度

当crop size被固定为224*224时,理论上S可以设置为任何不小于224的值。当S=224时,说明crop时剪切的是整个图片的数据;当S远远大于224时,crop将对应于图像的一小部分,包括一个小对象或一个对象部分。

考虑了两种设置训练尺度S的方法:

  • 一种是固定S的大小,对应于单尺度训练(注意在采样裁剪中的图片内容仍能够代表多尺度图片数据)。在这个实验中设置了两个固定的S大小,即256和384。根据配置,我们一开始使用S=256进行训练,为了加速S=384的网络,将weight初始化为在S=256时预训练时得到的值,lr=10-3
  • 另一个方法是设置S为多尺度,即每个图片重置大小的S的值随机在某个范围[Smin,Smax]取值(设置Smin=256,Smax=512)。 因为图片中的对象可能是不同的大小,在训练时将其作为考量是十分有效的。通过尺度抖动,该多尺度能够被看作是一种训练集增强方式,即单模型被训练去在一个大尺度范围中识别对象。因为速度的原因,我们通过微调有着同样配置,即预训练时有着固定的S=384的单尺度模型的所有层来训练多尺度模型,

2)测试

Q:预定义的图片重置大小的最小图片边,称为测试尺度

Q不需要等于训练尺度S,我们也会使用水平翻转来增加测试数据集

multi-crops

由于全卷积网络应用于整个图像,因此不需要在测试时对多个crops进行采样(Krizhevsky et al., 2012),效率较低,需要网络对每个crops重新计算。同时,像Szegedy等人(2014)所做的那样,使用大量的crops集可以提高精度,因为与全卷积网络相比,它可以对输入图像进行更精细的采样。

同时,multi-crop评价是dense评价的补充,由于不同的卷积边界条件:当应用一个ConvNet到一个crop中时,卷积特征映射将用0填充,然而在dense评估的情况下,对于相同crop,其填充自然来自于邻近的部分图像(由于卷积和空间池化),这大大增加了整体网络接受域,所以能够捕捉更多的上下文。虽然我们相信在实践中多crops的增加计算时间并不证明准确性的潜在收益,为了参考,我们使用每个尺度50个crops(5 × 5个规则网格,2次翻转)来评估我们的网络,总共是3种尺度以上的150个crops,相当于Szegedy et al. (2014)中4尺度以上的144个crops

3.结果

1)图片单尺度的评估-test

从结果可见A-LRN的效果并没有比A好,所以后面的B-E网络都没有使用BN层

我们也可以看见分类错误随着网络层次的增加分类的错误率在降低。可见在同一个深度的网络中C和D中,使用了1*1卷积核的C的性能差于使用了3*3的D。但是从C优于B我们又可以看出额外的非线性函数还是有用的,从D优于C可见使用并非微不足道的卷积核(即3*3的效果比1*1的好)能更好地获取空间内容

由上图可见(S在[256;512]两个值)的训练效果是优于(S=256或S=384)的。这证实了通过尺度抖动增强训练集确实有助于捕获多尺度图像统计量。

2)图片多尺度的评估-test

Q={S-32,S+32}。与此同时,在训练时使用了尺度抖动,即S在[256;512]两个值时,它将允许在测试时网络被应用在更宽的尺度范围中,Q={Smin, 0.5(Smin+Smax), Smax}

由下图可见在测试时的尺度抖动导致更好的性能

3)multi-crop评估

使用dense和multi-crop两种评估方法,还通过平均两者的softmax输出来评估两者的互补性。由下表可见multi-crop比dense的效果要好一些,且两者是互补的,因为他们两者结合的结果比他们各自的结果都要好

VGG网络-ILSVRC-2014亚军的更多相关文章

  1. VGG网络

    VGG论文给出了一个非常振奋人心的结论:卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用.记得在AlexNet论文中,也做了最后指出了网络深度的对最终的分类结果有很大的作用. ...

  2. 关于VGG网络的介绍

    本博客参考作者链接:https://zhuanlan.zhihu.com/p/41423739 前言: VGG是Oxford的Visual Geometry Group的组提出的(大家应该能看出VGG ...

  3. 第二十四节,TensorFlow下slim库函数的使用以及使用VGG网络进行预训练、迁移学习(附代码)

    在介绍这一节之前,需要你对slim模型库有一些基本了解,具体可以参考第二十二节,TensorFlow中的图片分类模型库slim的使用.数据集处理,这一节我们会详细介绍slim模型库下面的一些函数的使用 ...

  4. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  5. VGG网络的Pytorch实现

    1.文章原文地址 Very Deep Convolutional Networks for Large-Scale Image Recognition 2.文章摘要 在这项工作中,我们研究了在大规模的 ...

  6. BUPT复试专题—网络传输(2014网研)

    题目描述 网络的高效互联与智能传输是提升海量用户服务请求映射效率的重要措施.在这个任务中,你需耍在最小的传输时间内,将数据源传输到指定的网络节点中.我们给定的网络一共包含N个节点,其中节点1为数据源. ...

  7. 卷积神经网络特征图可视化(自定义网络和VGG网络)

    借助Keras和Opencv实现的神经网络中间层特征图的可视化功能,方便我们研究CNN这个黑盒子里到发生了什么. 自定义网络特征可视化 代码: # coding: utf-8 from keras.m ...

  8. 学习笔记-ResNet网络

    ResNet网络 ResNet原理和实现 总结 一.ResNet原理和实现 神经网络第一次出现在1998年,当时用5层的全连接网络LetNet实现了手写数字识别,现在这个模型已经是神经网络界的“hel ...

  9. VGG(2014),3x3卷积的胜利

    目录 写在前面 网络结构 multi-scale training and testing 其他有意思的点 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 VGG(2 ...

随机推荐

  1. linux网络编程之posix消息队列

    在前面已经学习了System v相关的IPC,今天起学习posix相关的IPC,关于这两者的内容区别,简单回顾一下: 而今天先学习posix的消息队列,下面开始: 接下来则编写程序来创建一个posix ...

  2. webpack 配置react脚手架(四):路由配置

    1. 由于 react-router 是集成了 react-router-dom 和 react-router-native的一起的,所以这里要使用的是 react-router-dom, 2. 安装 ...

  3. vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.

    默认,webpack无法打包.vue文件,需要安装 相关的loader: cnpm i vue-loader vue-template-compiler -D 提示以下错误信息: Module Err ...

  4. 源码安装缺少configure文件

    源代码中没有configure的软件安装方法 今天下载了一个旧版的GeoIP软件包,解压以后发现代码包中没有configure文件,现在这这里记录一下安装遇到的问题 网上大部分GeoIP下载地址已经失 ...

  5. 【xsy2978】Product of Roots 生成函数+多项式ln+多项式exp

    题目大意:给你两个多项式$f(x)$和$g(x)$,满足$f(x)=\prod\limits_{i=1}^{n}(a_i+1)$,$g(x)=\prod\limits_{i=1}^{m}(b_i+1) ...

  6. MyBatis 接口注解方式代替mapper.xml

    https://blog.csdn.net/m0_38068812/article/details/86566929 spring boot(8)-mybatis三种动态sql  或者 这个 1. 代 ...

  7. k8s aliyun mirros

    安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum ...

  8. Vue.js-组件化前端开发新思路

    Vue.js-组件化前端开发新思路 12017.04.14 18:31:25字数 6228阅读 5632 本文章是我最近在公司的一场内部分享的内容.我有个习惯就是每次分享都会先将要分享的内容写成文章. ...

  9. 【转】Sentry 入门实战

    Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题.它主要专注于持续集成.提高效率并且提升用户体验.Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在 ...

  10. http状态码-备查

    http状态码分类 分类 分类描述 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作被成功接收并处理 3** 重定向,需要进一步的操作以完成请求 4** 客户端错误,请求包含语 ...