前言:
AlexNet是2012年ImageNet竞赛冠军(以领先第二名10%的准确率夺得冠军)获得者Hinton和他的学生Alex Krizhevsky设计的,在ILSVRC-2010测试集上取得了top-1错误率37.5%,top-5错误率17.0%(优于第二名的16.4%),明显优于之前的方法,证明了深度卷积神经网络在图像识别任务上的强大能力,后续各种优秀的更深的神经网络被提出。
论文:
论文翻译文档:
https://download.csdn.net/download/p731heminyang/89551903
跟Lenet距离约10年,在CNN的基础上面碰到了一些问题,比如说CNN的过拟合(就是训练的数据精度特高,真实数据精度差)、激活函数的效率问题以往的tanh和sigmoid、GPU内存太小无法训练、以前池化都采用平均池化造成特征采集模糊化、数据量太小等。
AlexNet解析
今天我们来看看AlexNet,首先就是网络图
我们来分析下网络图,整个网络图共分为8层,这里的架构用了双GPU架构,所以采用了两层架构,主要是受限于当前的硬件限制,当个GPU的显存有限(当时使用的GTX 580 GPU只有3GB的内存),在训练的时候没有显示不够用,所以用双GPU的方式替代,所以相应的结构也需要调整,调整为上下两层,现在GPU能力足够不需要通过这种上下层的方式了。
这里采用的是RGB三色
第一层(卷积层)C1:
输入大小:3x224x224 ,相比与LeNet这里采用的彩色图RGB,所以是3,为啥是224了,论文里面也介绍了,它采用数据增强,是从256x256图片里面 随机选取或者反转224x224的图片去做训练,这样数据量大,但是也会容易过拟合,这里采用了其他的方式防止。
卷积核:96个11x11x3的卷积核,卷积核的步长是4;这是个三维卷积核对应的图片的RGB,96个卷积核分为两部分对应两个GPU,每一组GPU对应一个48个11x11x3的卷积核。
输出大小:96x55x55,通过公式得出W=(224-11)/4 +1 得出目标的长宽54.5 ,一般为了尽可能保留特征选择向上取整,输出为55,由于卷积核为96个,所以输出的图形也有96个,只不过由于双GPU原因分为了两组分别为48个55x55的图。
参数大小:34,944个,学习参数,需要存储的,共96组wx+b ,其中w为3x11x11 ,b就是常数,所以为1,96x(3x11x11+1)=34944
激活函数:ReLU
通过卷积核把整张图3x224x224分别过滤到两个GPU上面,每个GPU包含48张55x55的图,为后面的双GPU进行执行,当然现在已经没有这么采用了,基本GPU的显存也比较大,而且GPU的算力也比之前大多了。
第二层(池化层)P1:
这里是最大池化层,就是在区域内选取最大值
输入大小:96x55x55 ,这里是前面一层的输入,当然这里也分为了两层,两个GPU分别选择前面对应卷积的48x55x55进行池化
滤波器:3×3 ,步长为2 最大池化
输出大小:96x27x27 ,按照计算得出(55-3)/2 +1 =27
参数大小:0,池化层一般没有学习参数,有些特殊的池化层也可以系数可以学习,但是标准的没有。
这里选取的池化是最大池化,因为平均池化容易让特征混淆,所以后续的网络里面池化大多都是选取的最大池化层。而且论文提出了一个观点就是重叠池,就是步长需要小于滤波器核,这样可以多选取一些重叠的特征进行特征增强会是模型减少过拟合。
第三层(卷积层)C2:
输入参数:96x27x27,上一层输入,相同的GPU池化之后进入卷积,每个GPU都得到48个27x27的图进行计算。
卷积核:256个5x5,步长为1,填充为2,分为两组128个5x5的卷积核当为2个GPU进行运算
输出参数:256x27x27,宽高度计算,通过公式:(27-5+2x2)/1 + 1 =27,通道等于卷积核个数256个。
参数大小:6,656,计算公式256个wx+b,w为5x5 b为1 ,所以256x(5x5+1)=6656
激活函数:ReLU
第四层(池化层)P2:
输入参数:256x27x27,上一层输出,交叉计算到了两个GPU,每组128x27x27。
滤波器:3x3,步长为2。最大池化层
输出参数:256x13x13,宽高度计算,(27-3)/2 + 1= 13
参数大小:0,没有带权重
第五层(卷积层)C3:
输入参数:256x13x13,上一层输出
卷积核:384个3×3x256,步长1,填充1 ,这里做了GPU的交叉计算,这里计算的时候卷积核会把一张图256x13x13进行覆盖,所以卷积核通道是256
输出参数:384x13x13,宽高计算,(13-3+1x2)/1+1= 13,宽高没有变化
参数大小:885,120,公式:384x(3x3x256+1)=885120
激活函数:ReLU
第六层(卷积层)C4:
输入参数:384x13x13,上一层输出
卷积核:384个3×3×192,步长1,填充1 ,这里没有对整张图进行交叉计算了,分开两个GPU得出的数据192x13x13来进行计算了
输出参数:384x13x13,宽高计算,(13-3+1x2)/1+1= 13,宽高没有变化
参数大小:663,936,公式:384x(3x3x192+1)=663936
激活函数:ReLU
第七层(卷积层)C5:
输入参数:384x13x13,上一层输出
卷积核:256个3×3×192,步长1,填充1
输出参数:256x13x13,宽高计算,(13-3+1x2)/1+1= 13,宽高没有变化
参数大小:442,624,公式:256x(3x3x192+1)=442624
激活函数:ReLU
第八层(池化层)P3:
输入参数:256x13x13,上一层输出
滤波器:3x3,步长为2。最大池化层
输出参数:256x6x6,宽高度计算,(13-3)/2 + 1= 6
参数大小:0,没有带权重
第九层(全连接层)F1:
输入参数:256x6x6
输出参数:4096 ,正常的全连接是不可能得到4096的,而是得到256x6x6=9216的,这里全连接层自己做了特殊处理,某些参数进行合并了才得到4096,非标准全连接。
参数大小:37,605,376, 计算,4096个wx+b,w为256x6x6,4096x(255x6x6+1)=37605376
注意后面跟着Dropout,在轮文中提到了在两个全连接层中包含Dropout,但是图上没有写,这里就
第十层(Dropout)D1:
输入参数:4096
丢弃率:0.5 随机失活50%的节点,就是把输出置为0
输出参数:4096
参数个数:0
Dropout在训练中体现,推理中不起作用,这里图也没有显示,主要用于随机失活一些数据,就是把一些输出数据赋值为0,这样的话可以起到防止过拟合,提高泛化率。
第十一层(全连接层)F2:
多几层全连接层进行特征整合,方便后续的分类。
输入参数:4096
输出参数:4096
参数大小:16,781,312, 参数为4096个wx+b ,w为4096,那么为4096x(4096+1) =16781312
第十二层(Dropout)D2:
输入参数:4096
丢弃率:0.5 随机失活50%的节点,就是把输出置为0
输出参数:4096
参数个数:0
第十三层(全连接层)F3:
最后一层,进行分类处理,这里显示类型的概率
输入参数:4096
输出参数:1000
参数大小:4,097,000,1000个wx+b,w为4096,那么为1000x(4096+1)=4097000
激活参数:Softmax 此激活函数是为了分类使用,进行归一化,把所有数据化为0~1之间的小数,所有数的累加和为1,这样排序下选择得分最高的就是哪个对象了,把1000进行类别分类,这个在训练的时候标记数据需要准备。
比如1 动物牛 2是动物羊 ... 1000 动物老虎 ,如果下标2 为0.99 分数最高,那么就能够得出这张图片对象为动物羊了。
总结:
AlexNet 针对之前的CNN做出来改进,把网络模型增加了(之前训练的5层到8层),并且带权重的网络增加到了8层,识别种类可以达到1000种,在当时是非常不错了,参数60,516,968个(大约6000w个权重参数,和论文里面的60million对上了)。里面包含的可训练的网络层只有8层(C1、C2、C3、C4、C5、F1、F2、F3)相当于现在的网络层级来说层数太浅了无法支持更复杂的特征。
AlexNet提出的改进点有:
- 重叠池:提出步长小于滤波器的边数,这样获取值的时候能够对有效特征进行重复提取,可以提高识别精度。例子:比如滤波器为5x5,那么步长为1~4,就会形成重叠池了,就是重复采集;而且这里使用了最大池化作为有效特征,避免之前的平均池化带来的模糊化特征的情况,后续神经网络基本也是采取的最大池化。
- ReLU:函数(𝑓(𝑥)=max(0,𝑥))把relu激活函数发扬光大了,之前一直使用的是tanh和sigmoid,比起他们速率提高了(只取0和最大值)、提高稀疏性(只取大于0的数据,去除其他部分减少依赖)、避免了梯度消失问题(在正数区域,梯度恒为1)
- Dropout:引入Dropout随机失活一部分神经网络的值,避免整个神经网络过拟合,这里后面的全连接用到了此技术,就是计算之后随机把结果赋值为0。
- GPU加速:引用了GPU加速网络升级的训练和推理,这里由于当时的GPU显存低,还用到了双GPU架构,后续GPU提升显存,后面的框架基本没有采用此种架构了。
- 数据增强:受限于之前的数据量大小,这里提出了数据增强的功能,比如从256x256 选取224x224的区域,这里是从四个角和中间选取224x224,并且水平翻转增加数据量,从而减少过拟合的风险。
代码:
这里由于当前框架都不太兼容双GPU架构,这里不提供代码展示了(学习学习思想)。