🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题
🍊专栏推荐:深度学习网络原理与实战
🍊近期目标:写好专栏的每一篇文章
🍊支持小苏:点赞👍🏼、收藏⭐、留言📩
先来看一下我们要讲述哪些经典的网络模型,如下:
- LeNet :最早用于手写数字识别的CNN网络
- AlexNet :2012年ILSVRC比赛冠军,比LeNet层数更深,这是一个历史性突破。
- ZFNet :2013年ILSVRC比赛效果较好,和AlexNet类似。
- VGGNet :2014年ILSVRC比赛分类亚军、定位冠军
- GoogleNet :2014年ILSVRC分类比赛冠军
- ResNet :2015年ILSVRC比赛冠军,碾压之前的各种网络
LeNet
1989年,Yang LeCun等人提出了LeNet网络,这是最早的卷积神经网络,极大的推动了深度学习的发展,Yang LeCun也被称为卷积网络之父。确实,这样的大牛也该被每个科研人所记住,这里可以来看一下Yang的照片,一看就很有学问有木有👨🏼🎓👨🏼🎓👨🏼🎓👨🏼🎓👨🏼🎓
好了,下面就来看看这个大能所设计的网络结构,如下图:
现在看来,这个网络是非常简单的,一共有五层(仅包含有参数的层,无参数的池化层不算在网络模型之中,之后所说的层都不包括池化层):
- 输入尺寸:32*32
- 卷积层:2个
- 池化层:2个
- 全连接层:2个
- 输出层:1个,大小为10*1
现通过下图逐一讲讲这些层:
- 输入层:LeNet的输入是32*32*1大小的灰度图(只要一个颜色通道)。
- CONV1(第一个卷积层):对大小为32*32*1的灰度图进行卷积,卷积核大小为5*5,步长s为1,卷积核个数为6,进行卷积操作后得到大小为28*28*6特征图(卷积后特征图大小不会计算的自行百度)。
- 第一个池化层:LeNet采用的是平均池化的方法,上层卷积得到的特征图尺寸为28*28*6,对此大小特征图进行池化操作。池化核大小为2*2,步长s=2,进行第一次池化后特征图大小为14*14*6(池化后特征图大小不会同样自行百度,卷积和池化得到特征图的公式基本是一致的)。
- CONV2(第二个卷积层):对池化得到的14*14*6大小的特征图进行第二次卷积,卷积核大小为5*5,步长s为1,卷积核个数为16,进行卷积后得到大小为10*10*16的特征图。
- 第二个池化层:池化核大小为2*2,步长s=2,进行第二次池化后特征图大小为5*5*16。
- 第一个全连接层:上一步得到的特征图尺寸是5*5*16,经过这层后输出大小为120*1。这一步其实有一定的迷惑性,开始接触神经网络时可能不是很理解,怎么一个三维的向量一下子就变成了一个一维的?我想看网络模型这部分的人也该对这里是比较清楚的了,但考虑到内容的完整和严谨,这里也简单说一下:其实在得到5*5*16的特征图后,还要进行一个flatten(展平)操作,即是将5*5*16的特征图展开成一个(5x5x16)*1=400*1大小的向量,然后再进入到全连接层。讲到这里应该就很清晰了,在第一个全连接层我们输入的是400个神经元,输出是120个神经元。
- 第二个全连接层:和上一层类似,输入的是120个神经元,输出的是84个神经元。
- 输出层:从得到84个神经元后,其实再经过一个全连接就得到输出,大小为10*1。
AlexNet
我们直接来看AlexNet的网络架构,如下图所示:可以看出AlexNet和LeNet的整体结构还是非常类似的,都是一系列的卷积池化操作最后接上全连接层。同样的,我们将对每层都进行详细的讲解,即是怎么通过卷积核和池化核得到相应的特征图大小的。该网络一共有8层(不包括池化),如下:
- 输入尺寸:227*227*3
- 卷积层:5个
- 池化层:3个
- 全连接层:2个
- 输出层:1个,大小为1000*1
- 输入层:AlexNet的输入是227*227*3大小的彩色图片(有三个颜色通道)
- 第一个卷积层:对大小为227*227*3的彩色图片进行卷积,卷积核大小为11*11,步长s为4,padding=0,卷积核个数为96,进行卷积后得到大小为55*55*96的特征图。
- 第一个池化层:**AlexNet采用的是最大池化的方法。上层卷积得到55*55*96的特征图,对此特征图进行最大池化操作。池化核大小为3*3,步长s为2,padding=0,经池化后特征图大小为27*27*96。
- 第二个卷积层:输入维度为27*27*96,卷积核大小为5*5,步长s为1,padding=2,卷积核个数为256,进行卷积后得到大小为27*27*256的特征图。 【注1:这里可能有人不明白了,为什么这里的步长s=1,padding=0 ?这里就设计到卷积的三种模式了,不知道的请点击传送门了解。总之,我们可以设置特定的s和padding来达到卷积前后特征图前两个维度大小不变的效果】 【注2:看到上图此步卷积时写有same,则表示卷积的方式是same mode,也即卷积前后特征图大小相同】
- 第二个池化层:输入维度为27*27*256,池化核大小为3*3,步长s为2,padding=0,经池化后特征图大小为13*13*256。
- 第三个卷积层:输入维度为13*13*256,卷积核大小为3*3,步长s为1,padding=1,卷积核个数为384,进行卷积后得到大小为13*13*384的特征图。
- 第四个卷积层:输入维度为13*13*384,卷积核大小为3*3,步长s为1,padding=1,卷积核个数为384,进行卷积后得到大小为13*13*384的特征图。
- 第五个卷积层:输入维度为13*13*384,卷积核大小为3*3,步长s为1,padding=1,卷积核个数为256,进行卷积后得到大小为13*13*256的特征图。
- 第三个池化层:输入维度为13*13*256,池化核大小为3*3,步长s为2,padding=0,经池化后特征图大小为6*6*256。
- 第一个全连接层:输入的是6*6*256=9216个神经元,输出的是4096个神经元。
- 第一个全连接层:输入的是4096个神经元,输出的是4096个神经元。
- 输出层:得到4096个神经元后,其实再经过一个全连接就得到输出,大小为1000*1。
上述已经把AlexNet各层结构给描述清楚了,但模型的一些细节没有描述,如加入了relu激活函数,加入了局部应答标准化(LRN,后再VGG中证明这步是无效的),同时也加入了Dropout层,具体的网络结构如下图。【注:下图描述的是再两台GPU上运行的结构图,是在当时算力不够的情况下减小训练时间所采用的技巧,现已不需要。】
下面总结一下AlexNet的一些创新点:
- 使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题,此外,加快了训练速度,因为训练网络使用梯度下降法,非饱和的非线性函数训练速度快于饱和的非线性函数。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
- 训练时使用Dropout随机忽略—部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
- 在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
- 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。【此方法在之后的VGG中被认为是无效的】
- 使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX580GPU进行训练,单个GTX580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。【现在随着算力的增强,也不太需要使用双GPU加速】
- 数据增强,随机地从256*256的原始图像中截取224*224大小的区域(以及水平翻转的镜像),相当于增加了数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。
ZFNet
ZFNet的网络结构和AlexNet的结构基本是一致的,主要的改变就是在AlexNet的第一层将卷积核的大小由11*11变成了7*7,并且将步长s由4变成了2。既然ZFNet相比于AlexNet只改变了这么点,那为什么要讲这个结构呢。这是我觉得ZFNet更宝贵的是提出了一种逆变换的思想来可视化了神经网络,将卷积核变小也是因为可视化而产生的结论,即小卷积核使网络效果更好。