计算机视觉系列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来进行训练能够满足昂贵的计算需求。
论文地址
网络结构
2. 网络设计
AlexNet有8层,前五层是卷积层(部分层进行了max-pooling),后三层是全连接层。
-
使用不饱和的ReLU**函数 – 验证了在较深网络中的效果超过了sigmoid。
-
使用多个GPU进行训练 – 一个GTX580 GPU有3GB显存,不能够训练过大的网络。作者将网络分布到两个GPU上,每个GPU的显卡中存储一半的神经元参数。
-
提出LRN层(Local Response Normalization) – ReLU不需要输入数据进行归一化(防止饱和),在ReLU之后,使用LRN增加了泛化能力,做了平滑处理,提高了识别率1%~2%。
-
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)。作者发现,在训练时使用重叠池化可以缓解过拟合。
-
数据增强(Data Augmentation) – 使用两种方式进行数据增强。
(1) 图像变换和水平翻转。训练时,对于一张256×256的图片,使用一个224×224的滑动窗口进行crop,并进行水平翻转,再进行训练。数据集扩大了2048倍,这样模型就更加见多识广了。测试时,对左上、右上、左下、右下、中间做了5次crop,然后翻转,共10个crop。之后对结果求平均。
(2) 改变训练集中图片的RGB通道值,对ImageNet数据集中图片的RGB空间做PCA,然后对主成分做一个(0,0.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%。
参考博客