戳一戳!和我一起走进深度学习的世界
导读
之前,我们学习了LeNet和AlexNet,我想大家应该还是有比较深刻印象的,今天我们要来学习的是VGG,一个为卷积神经网络发展开辟的新领域的网络。
今天要分享这篇文章带我们一起了解VGG的概念和特点,VGG网络结构,VGG的优缺点以及VGG和Alex的对比。
如果你想深入了解VGG对应的论文翻译,可以看这篇文章:
论文 | VGG:用于大规模图像识别的超深度卷积网络
如果你想更加深入了解技术讲解,那就让我们走进这篇文章,一起来了解一下吧!如果你有什么问题,或者有什么想法,欢迎评论与我一起沟通交流。
1 说在前面的话
1 VGG简述
1、VGG由来
VGG模型的名称来源于牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人。
2、VGG 与 GoogLeNet
VGG和GoogLeNet是2014年ILSVRC竞赛的双雄,VGG模型是2014年ILSVRC竞赛的第二名,GoogLeNet是第一名。但是VGG模型在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。它的缺点在于,参数量有140M之多,需要更大的存储空间,而GoogLeNet远小得多。
后面我们会通过一幅图,让大家更清晰看到两个模型的差别。
2 相关文章
卷积神经网络系列文章兜兜转转,也更新了一些了。大家可以从这里更快速阅读相关的文章。
【深度学习基础系列】
▶ 一篇文章解决卷积运算中的尺寸问题
▶ 盘天盘地盘“直男”,激活函数不简单
【卷积神经网络系列】
▶ 01 卷积神经网络简介
▶ 02 LeNet-5原理及代码详解
▶ 03-1 AlexNet网络结构与原理分析
▶ 03-2 AlexNet网络搭建与输出
【相关论文】
▶ AlexNet:ImageNet Classification with Deep CNN
▶ Large Scale Distributed Deep Networks
▶ Cooperative Initialization based DNN Training
▶ VGG:用于大规模图像识别的超深度卷积网络
【目标检测系列】
▶ YOLO v1 论文笔记 01
▶ YOLO v1 论文笔记 02
▶ YOLO v4 论文翻译
▶ 重磅!!!OpenCV4.4.0新鲜出炉!支持YOLO v4,SIFT免费使用
▶ 尝鲜!Windows下实现YOLOv4物体检测
▶ Python+OpenCV4实现YOLO v4物体检测
▶ 视频教程:基于OpenCV4.4的YOLO4实战教程
接下来,让我们一起走进今天的内容吧!
2 VGG特点
VGG虽然只取得了第二名,但是它提出了很多有意义的概念。总结一下就是:小核深网络。
1 小卷积核
VGG将所有的卷积核都换成了3×3,极个别使用1×1。
我们要考虑这三个问题:
能不能换?
怎么换?
为什么要换?
1、首先我们来看第一个问题,能不能换?
我们看最初的两个卷积神经网络LeNet和AlexNet,他们都是将一个n×n×c的图像最终变成了1×1×k的矩阵。其中n表示的是输入图像的尺寸(行与列),c表示图像的通道数(深度),取值为1或3,k表示的是最终分类的个数。
也就是说我们可以把卷积神经网络的操作理解为:通过一系列操作,将一个图像的像素数据经过运算得到不同类别的分数(置信度)。我们只要能得到正确的分类分数即可,具体的操作细节,可以有所调整。所以说,我们是可以更换卷积核的大小的。
2、知道可以换,怎么换呢?
既然要达到上面的要求,我们就可以改动参数层,即卷积层和全连接层,卷积层的主要目的是提取特征,全连接层的主要目的是特征融合。卷积层一般都会跟着激活层,使得模型可以非线性分类;几个卷积层后面会跟着池化层,为了降低算法的运算量。
所有我们可以基于上面的去进行改动参数层,然后要保证,卷积操作要能够遍历到所有的像素,运算不能越界。这样我们就可以对网络进行修改。
3、那为什么要换呢?
既然要换,肯定是因为换完之后,能够带来好处。
首先好处就是小卷积核参数量更少,论文中提到,两个3×3的卷积核就可以替换一个5×5的卷积核,两个3×3的卷积核,如果深度为d,那么参数的个数就为2*3*3*d = 18d,但一个5×5的卷积核的参数为5*5*d = 25d,参数减少了将近1/3。我们也可以推导出,按照这种替换方式,越小的卷积核,卷积参数数量就越少,卷积运算就越少。1×1无法获取上下文像素的联系,也就没法很好地提取特征,所以就几乎全方面使用3×3代替。在配置C中,采用了一些1×1的卷积核,后面我们会专门讲1×1卷积核的作用。
其次,使用小卷积核代替大卷积核,可以引入更多非线性,分类效果更好。比如一个5×5的卷积核,只进行一次非线性变换,而两个3×3的卷积核,则经过两次非线性变换。
其次一个好处,大家看后面的内容会发现,VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸,这样我们就可以让定义的模型更加规范化,也可以将卷积神经网络更加模块化。这在我们以后的代码中也会体现出来。
2 小池化核
VGG全部使用2×2的卷积核,卷机步长为1。可以使池化后的特征图行列缩小为原来的1/2。
小池化核是将四个数据变为一个数据,每个数据最多访问两遍,相比于之前的3×3,也极大的提升了算法效率。
3 全连接转卷积
全连接转卷积的操作主要是在测试的时候,目的是为了提升效率。使用卷积也会增加整体网络的感受野,捕获更多上下文。具体的内容,大家可以深入阅读我前面对原论文的翻译:
论文 | VGG:用于大规模图像识别的超深度卷积网络
2 VGG结构层次
学习VGG的时候,我们经常会看到这三幅图。
第一幅图是针对于卷积参数的表格描述:
第二幅图是图像化的VGG结构(立体图,以VGG-16为例)
第三幅图是图像化的VGG参数(平面图)
不管是哪种表示方法,其结构都是一致的,考虑到VGG模型比较多,我们使用VGG-16来做讲解。
首先要说明,VGG-16不是有16层,而是16个权重层。VGG-16的全部层数如下:
13个卷积层,也就是表中的conv3-XXX。
3个全连接层,也就是表中的FC-XXXX。
1个输入层,5个池化层(最大池化),一个soft-max激活层。
其中,卷积层和全连接层是有权重参数的,也就是一共有16个带权重的层,这就是16的由来。为了方便大家对结构有更好的理解,我们将VGG分为不同的块,每一块包含多层,分不同的块的原则是:将卷积(线性整流)-池化为模块进行分层。
VGG-16的模型分块如下:
第一块:包括输入层、两个卷积层(卷积后需要ReLU激活)、一个池化层。
第二块:包括两个卷积层(卷积后需要ReLU激活)、一个池化层。
第三块:包括三个卷积层(卷积后需要ReLU激活)、一个池化层。
第四块:包括三个卷积层(卷积后需要ReLU激活)、一个池化层。
第五块:包括三个卷积层(卷积后需要ReLU激活)、一个池化层。
第六块:包括三个全连接层(需要ReLU激活)、一个softmax层。
后面,我们会更加细致讲解其具体的参数,因为每次卷积操作之后会有ReLU激活,所以我们在标题中就不再强调。
1 第一块:输入+2*卷积+池化
第一块是VGG的开头,包括下面红色框中的四层:
输入图像的尺寸为224×224×3。
1、两次卷积层的卷积操作
首先要在四边做一个像素的边缘填充,一像素边缘填充是每个卷积操作前所必要的,这是为了卷积后的图像长和宽和卷积前是一致的。后面也是这样,我们就不再过多说明。使用64个3×3×3的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为224×224×64。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用64个3×3×64的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为224×224×64。得到特征图后,使用ReLU对特征图进行激活。
2、池化层的池化操作
使用2×2的最大池化,池化的步长为2,得到的特征图的大小为112×112×64。
总结
总结一下,在这一块中:
输入图片尺寸:224×224×3
第一次卷积核与步长:3×3×3*64 / 1
卷积后特征图大小:224×224×64
第二次卷积核与步长:3×3×64*64 / 1
卷积后特征图大小:224×224×64
池化大小与步长:2×2 / 2
池化后特征图大小:112×112×64
2 第二块:2*卷积+池化
第二块包括下面红色框中的三层(完整在框里的三层):
上一层得到的特征图的尺寸为112×112×64。
1、两次卷积层的卷积操作
做一像素边缘填充后,使用128个3×3×64的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为112×112×128。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用128个3×3×128的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为112×112×128。得到特征图后,使用ReLU对特征图进行激活。
2、池化层的池化操作
使用2×2的最大池化,池化的步长为2,得到的特征图的大小为56×56×128。
总结
总结一下,在这一块中:
上一层得到的特征图尺寸:112×112×64
第一次卷积核与步长:3×3×64*128 / 1
卷积后特征图大小:112×112×128
第二次卷积核与步长:3×3×128*128 / 1
卷积后特征图大小:112×112×128
池化大小与步长:2×2 / 2
池化后特征图大小:56×56×128
3 第三块:3*卷积+池化
第三块包括下面红色框中的四层(完整在框里的四层):
上一层得到的特征图的尺寸为56×56×128。
1、三次卷积层的卷积操作
做一像素边缘填充后,使用256个3×3×128的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为56×56×256。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用256个3×3×256的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为56×56×256。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用256个3×3×256的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为56×56×256。得到特征图后,使用ReLU对特征图进行激活。
2、池化层的池化操作
使用2×2的最大池化,池化的步长为2,得到的特征图的大小为28×28×256。
总结
总结一下,在这一块中:
上一层得到的特征图尺寸:56×56×128
第一次卷积核与步长:3×3×128*256 / 1
卷积后特征图大小:56×56×256
第二次卷积核与步长:3×3×256*256 / 1
卷积后特征图大小:56×56×256
第三次卷积核与步长:3×3×256*256 / 1
卷积后特征图大小:56×56×256
池化大小与步长:2×2 / 2
池化后特征图大小:28×28×256
4 第四块:3*卷积+池化
第四块包括下面红色框中的四层(完整在框里的四层):
上一层得到的特征图的尺寸为28×28×256。
1、三次卷积层的卷积操作
做一像素边缘填充后,使用512个3×3×256的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为28×28×512。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用512个3×3×512的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为28×28×512。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用512个3×3×512的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为28×28×512。得到特征图后,使用ReLU对特征图进行激活。
2、池化层的池化操作
使用2×2的最大池化,池化的步长为2,得到的特征图的大小为14×14×512。
总结
总结一下,在这一块中:
上一层得到的特征图尺寸:28×28×256
第一次卷积核与步长:3×3×256*512 / 1
卷积后特征图大小:28×28×512
第二次卷积核与步长:3×3×512*512 / 1
卷积后特征图大小:28×28×512
第三次卷积核与步长:3×3×512*512 / 1
卷积后特征图大小:28×28×512
池化大小与步长:2×2 / 2
池化后特征图大小:14×14×512
5 第五块:3*卷积+池化
第五块包括下面红色框中的四层(完整在框里的四层):
上一层得到的特征图的尺寸为14×14×512。
1、三次卷积层的卷积操作
做一像素边缘填充后,使用512个3×3×512的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为14×14×512。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用512个3×3×512的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为14×14×512。得到特征图后,使用ReLU对特征图进行激活。
做一像素边缘填充后,再使用512个3×3×512的卷积核对图像进行卷积,卷积的步长为1。这样得到的特征图的大小为14×14×512。得到特征图后,使用ReLU对特征图进行激活。
2、池化层的池化操作
使用2×2的最大池化,池化的步长为2,得到的特征图的大小为7×7×512。
总结
总结一下,在这一块中:
上一层得到的特征图尺寸:14×14×512
第一次卷积核与步长:3×3×512*512 / 1
卷积后特征图大小:14×14×512
第二次卷积核与步长:3×3×512*512 / 1
卷积后特征图大小:14×14×512
第三次卷积核与步长:3×3×512*512 / 1
卷积后特征图大小:14×14×512
池化大小与步长:2×2 / 2
池化后特征图大小:7×7×512
6 第六块:3*全连接+softmax
第六块包括下面的四层(前两层为1×1×4096,后两层为1×1×1000):
上一层得到的特征图的尺寸为7×7×512。
1、两次全连接层的全连接操作
首先使用4096个7×7×512的全连接矩阵对特征图像进行全连接,每个全连接矩阵和特征图运算会得到一个像素的数据,4096个全连接矩阵就会得到4096个像素的数据。这4096个像素的数据排成一行,这样得到的特征图的大小为1×1×4096。得到特征图后,使用ReLU对特征图进行激活。
然后使用4096个1×1×4096的全连接矩阵对特征图像进行全连接,也同样会得到4096个像素的数据。这4096个像素的数据排成一行,这样得到的特征图的大小为1×1×4096。得到特征图后,使用ReLU对特征图进行激活。
这两次全连接操作还有一个共同点,在原论文中有提到,每一个全连接层在计算过程中都使用了dropout归一化,dropout比例设为0.5。
2、一次全连接层的分类操作
这一次的全连接的目的就是为了分类了,一共有1000类,所以使用1000个1×1×4096的全连接矩阵对特征图像进行全连接,会得到1000个像素的数据。这1000个像素的数据排成一行,这样得到的特征图的大小为1×1×1000。得到特征图后,使用ReLU对特征图进行激活。
2、softmax
softmax是用来做回归的,会得到所属分类的置信度。
总结
总结一下,在这一块中:
上一层得到的特征图尺寸:7×7×512
第一次全连接矩阵:7×7×512*4096
全连接后特征图大小:1×1×4096
第二次全连接矩阵:1×1×4096*4096
全连接后特征图大小:1×1×4096
第三次全连接矩阵:1×1×4096*1000
全连接后特征图大小:1×1×1000
softmax后:1×1×1000
3 VGG分析
讲完了VGG的特点及其结构,我们来对VGG做更加深入的分析,以及VGG与AlexNet的对比。
1 优点
前面说的VGG的特点,基本上就是它的优点了。我们在这里系统总结一下:
1、结构更加统一、整洁,方便代码实现
2、使用小卷积核,卷积参数数量少,卷积运算少,效果优于大卷积核
3、提供了卷积神经网络的一个方向:加深网络能够提升性能
4、通过实验验证了LRN层作用不大
对于第三条,网络也不是能无限加深,在后面,何恺明大神等人的ResNet发现,加深到一定程度不仅不会提升精度,还会导致退化。
当然,那个是后续,我们后面再说,在此之后,提出更多更深、更复杂的网络。
2 缺点
VGG也是有缺点的,下面这幅图一些同学可能见过:
大家明显感觉到了,VGG的圆半径明显很大,几乎远大于前面绝大多数的模型。
VGG模型大,主要是来源于其全连接层,其中第一个全连接层直接对7×7×512的特征图做全连接,用到了4096个全连接矩阵,单是这一步的操作,就用到了7×7×512×4096 = 102760448 = 98M (其中1M = 1024K,1K = 1024)个参数。
所以VGG的第一个缺点就是模型大,虽然卷机参数少,单是全连接引入了大量参数。
具体模型大小如何计算,我们在这里不做过多讲述,后面我们会专门讲解。
3 VGG与AlexNet
VGG是AlexNet后的经典之作,VGG开辟了卷积神经网络的一个新的方向:深网络+小卷积核。VGG可以说是在AlexNet上的更进一步,也进一步确定了卷积神经网络的基本结构。
VGG也对GoogLeNet的后续版本提供了经验,个人感觉,GoogLeNet是在第一个版本的基础上,借鉴了VGG和ResNet的思想不断优化得到的。
所以,VGG和AlexNet都是卷积神经网络发展里程碑的重要部分。VGG和GoogLeNet也再一次向世人证明,深度学习和卷积神经网络在视觉的应用带给世界的伟大变革!
4 敲黑板
VGG是卷积神经网络发展的重要成员,是每一个学习卷积神经网络的人必须要掌握的。
希望大家能够通过今天这篇文章,了解VGG的结构,了解VGG的特点以及优缺点,在未来的学习中,对自己搭建合适的网络提供一定的启发。
后续,我们会专门再用一篇文章来讲解代码实战。也感谢大家一直以来的支持,我会一直努力,为大家带来好的文章,让我们一起努力,共同营造一个好的学习和科研氛围吧!
AI与区块链技术
长按二维码关注