计算机视觉系列2 AlexNet网络的思路

本文链接:https://blog.csdn.net/weixin_44633882/article/details/87708848

1.AlexNet网络简介

  AlexNet是一种卷积神经网络,设计者是Alex Krizhevsky,在AlexNet推出之前,Deep Learning已经沉寂了很久。AlexNet在2012年的ImageNet大规模图像识别竞赛中,达到了15.3%的 top-5 error,比亚军低了10.8%。AlexNet验证了网络的深度对好的表现力来说,是必要的。深度的增加意味着会产生更大的计算需求。使用GPU来进行训练能够满足昂贵的计算需求。

论文地址

https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

网络结构

计算机视觉系列2 AlexNet网络的思路

2. 网络设计

AlexNet有8层,前五层是卷积层(部分层进行了max-pooling),后三层是全连接层。

  1. 使用不饱和的ReLU**函数 – 验证了在较深网络中的效果超过了sigmoid。

  2. 使用多个GPU进行训练 – 一个GTX580 GPU有3GB显存,不能够训练过大的网络。作者将网络分布到两个GPU上,每个GPU的显卡中存储一半的神经元参数。

  3. 提出LRN层(Local Response Normalization) – ReLU不需要输入数据进行归一化(防止饱和),在ReLU之后,使用LRN增加了泛化能力,做了平滑处理,提高了识别率1%~2%。

  4. Overlapping Pooling(重叠池化) – 池化操作在部分像素上有重合。严格描述:池化核大小为n×n,stride=k。如果k=n,就是CNN中的传统池化,如果k<n,就是重叠池化。重叠池化(n=3,s=2)使top-1和top-5的错误率分别降低了0.4%和0.3%(相比较传统池化n=2,s=2)。作者发现,在训练时使用重叠池化可以缓解过拟合。

  5. 数据增强(Data Augmentation) – 使用两种方式进行数据增强。
    (1) 图像变换和水平翻转。训练时,对于一张256×256的图片,使用一个224×224的滑动窗口进行crop,并进行水平翻转,再进行训练。数据集扩大了2048倍,这样模型就更加见多识广了。测试时,对左上、右上、左下、右下、中间做了5次crop,然后翻转,共10个crop。之后对结果求平均。
    2(256224)(256224)=20482*(256-224)*(256-224)=2048
    (2) 改变训练集中图片的RGB通道值,对ImageNet数据集中图片的RGB空间做PCA,然后对主成分做一个(0,0.1)的高斯抖动,使用这种方案大大增加了数据集,这样就可以增大网络结构,否则会因为数据集过小而导致过拟合,从而只能使用小的网络结构。

参考博客

  1. https://blog.csdn.net/luoyang224/article/details/78088582
  2. https://zhuanlan.zhihu.com/p/38345420
  1. DropOut – 结合许多不同模型的预测结果是一种成功的方式来减小测试错误率,但训练一个大型神经网络是需要很长时间的。AlexNet采用了Dropout技术,使得在训练中只需要花费两倍于单模型的时间。其核心思想就是以0.5的概率,将每个隐层神经元的输出设置为0,以这种方式“dropped out”的神经元既不参与前向传播,也不参与反向传播。所以,每次输入一个样本就相当于这个神经网络采用一个新的结构,而且所有的结构共享权重。由于一个神经元不能依靠其他的神经元,所以降低了神经元之间复杂的互适应关系。然后网络就被迫学习到更鲁棒的特征。在测试时,我们使用所有的神经元,但对他们的输出乘以0.5,对于获取指数级dropout网络产生的预测分布的几何平均值,这是一个合理的近似方法。
      AlexNet中有两个全连接层使用DropOut,使收敛所需要的迭代次数大致增加了一倍,但避免了大量的过拟合。

3. 网络结构

从Conv1~FC2都是运行在两块个GPU上的,表中记录的参数是总参数,每个GPU的参数为总参数的一半。

层名 参数 输出
Input 224×224×3
Conv1(ReLU) + LRN1 kernel:11×11×3, stride:4, filter:96
Max Pooling1 kernel:3×3, stride:2
Conv2(ReLU) + LRN2 kernel:5×5×96, stride:1, filter:256
Max Pooling2 kernel:3×3, stride:2
Conv3(ReLU) kernel:3×3×256, stride:1, filter:384
Conv4(ReLU) kernel:3×3×384, stride:1, filter:384
Conv5(ReLU) kernel:3×3×384, stride:1, filter:256
Max Pooling3 kernel:3×3, stride:2
FC1(ReLU) + Dropout 4096
FC2(ReLU) + Dropout 4096
FC3(Output) 1000(类别)

4. 学习细节

1. 训练超参数

使用SGD训练模型,batch为128个样本,momentum:0.9,weight decay:0.0005(论文中提到,小的weight decay会影响到模型的学习,不仅起正则化的作用,而且减少了模型的training error)

2. 参数初始化

使用0-均值高斯分布来初始化每层的weights(deviation=0.01),将第2、4、5层卷积层和全连接层的biases初始化为1,其他层的bias初始化为0。这样给ReLU的输入是正输入,能够加快早期的学习。

3. 学习率

每个层的学习率相同,在训练过程中,手动调整。当验证集的错误率不再改变时,让当前学习率除10来优化。

4. 训练时间

论文中作者训练了1.2 million的图片,大概90轮。使用2块NVIDIA GTX 580 3GB GPUs,花费了5~6天。

5. 数据集

数据集使用ILSVRC-2010,AlexNet在ILSVRC上测试集的错误率:top-1达到37.5%, top-5达到17.0%

参考博客

  1. https://blog.csdn.net/lwplwf/article/details/72870378

相关文章:

  • 2021-10-02
  • 2021-06-28
  • 2021-08-13
  • 2021-06-18
  • 2021-11-21
  • 2022-12-23
  • 2021-11-06
  • 2022-01-02
猜你喜欢
  • 2021-06-21
  • 2022-01-11
  • 2021-05-02
  • 2021-05-04
  • 2021-04-15
  • 2021-05-15
  • 2022-02-19
相关资源
相似解决方案