AlexNet_原理详细

问题背景:本来想直接跳到R-CNN的,转念一想,基础没打牢还是不好,于是又回过头来学习学习AlexNet。
原文链接:https://blog.csdn.net/taoyanqi8932/article/details/71081390


一、原理部分

这里写图片描述
上图是来自paper的原汁原味AlexNet网络结构。可以看到:

整个网络从左往右,有一个输入,然后有8个需要训练的层,前5个为卷积层,最后3层为全连接层。分别说说这些层:

第一个层 conv_1:

  • 输入的图片大小为224*224*3
  • 有96个卷积核,尺寸为11*11,即11*11*96。步长(stride)为4.
  • 按照无padding的方式,输出的每个feature map尺寸应该为54*54

怎么计算出来?(224-11+1)/4,向上取整,或者 (224-11)/4+1,向下取整

但论文里面写输出的尺寸是55*55,关于这个,有2种解释:
1)这里用了padding=SAME的方式,可参考这个链接理解,有兴趣的去看API
https://www.jianshu.com/p/05c4f1621c7e
2)输入图片的尺寸给错了,应该是227*227.
- 96个卷积核,所以feature map的大小为55*55*96.
- 卷积层后跟ReLU,同时后面跟LRN层,尺寸不变.
- 然后跟着最大池化层,核大小为3*3,步长为2,因此feature map的大小为:27*27*96.(55-3+1)/2,向上取整=27

第二个层 conv_2:

  • 输入的tensor为27*27*96
  • 卷积核的大小为: 5*5*256,步长为1,如果按照无padding=VALID,输出feature map为:23*23*256,跟最大池化后的结果不符,因此倾向于认为本文都是padding=SAME。因此,步长为1时,feature map为27*27*256.
  • 同样紧跟ReLU,和LRN层.尺寸不变,
  • 最大池化层,核大小为3*3,步长为2,因此feature map为:13*13*256。(27-3+1)/2,向上取整=13

    第三个层 conv_3:

  • 输入tensor为13*13*256

  • 卷积核 3*3*384,步长为1,feature map为:13*13*384
  • 加上ReLU,尺寸不变
  • 无最大池化层

    第四个层 conv_4:

  • 配置和conv_3一样,因此feature map为:13*13*384

    第五个层 conv_5:

  • 输入tensor为13*13*384

  • 卷积核 3*3*256,步长为1,feature map为:13*13*256
  • 加上ReLU,尺寸不变
  • 最大池化层,核大小3*3,步长为2,因此feature map:6*6*256,(13-3+1)/2,向上取整6

在看全连接层前,可以补一下预备知识,我觉得这两个讲得蛮好的,从两个角度来说的:
https://blog.csdn.net/u011021773/article/details/78121359
https://blog.csdn.net/l691899397/article/details/52267166

这里想啰嗦一下,说说自己的见解。从维度的角度上来说。前面我们对二维图片进行卷积,卷积核也是二维的,但因为有多个卷积核,所以卷积出来的结果是三维的。现在,我们对三维的feature map进行卷积,卷积核也是三维的,有多个这样的卷积核,那么出来的结果是不是应该四维呢?是这样没错。但是!但是!但是!巧妙地用与feature map同样尺寸大小的卷积核,结果就会是一维的,其它三维点乘的结果是一个数字。
举个栗子,2*2矩阵点乘2*2矩阵,结果是啥?一个数字!n个2*2矩阵点乘2*2矩阵,结果是啥?拼接起来是一个一维向量。

第六个层 fc_1:

  • 卷积核6*6*256*4096,输出为一维向量,4096个元素。
  • 加上ReLU,尺寸不变

第七个层 fc_2:

  • 输出为一维向量,4096个元素。
  • 加上ReLU,尺寸不变

第七个层和第六个层元素个数一样,第七个层是不是有点多余?
那当然不是啦,虽然表面上元素个数一样。但是,其中有权重、有偏差、有反向传播,第七个层还是有发挥作用的!

第8个层 fc_3:

  • 输出为一维向量,1000个元素。最后一层用了softmax,输出为1000个种类的各类概率值.

这里怎么实现4096到1000的转换?都是一维的。那么就要从另一个角度来说了。全连接层的每一个结点都与上一层的所有结点相连,所以这里输出的向量元素个数是取决于全连接层节点个数,而不是上一层节点个数。

二、评价部分

1) AlexNet使用ReLU代替了Sigmoid,其能更快的训练,同时解决sigmoid在训练较深的网络中出现的梯度消失,或者说梯度弥散的问题。
激活函数的主要作用是引入了非线性,不太懂的可以参考链接:
https://www.zhihu.com/question/22334626
各个激活函数介绍及梯度消失及梯度弥散可参考链接:
http://www.360doc.com/content/17/1102/21/1489589_700400500.shtml,建议直接看第5点

2) 随机dropout一些神经元,以避免过拟合,

3) 在以前的CNN中普遍使用平均池化层average pooling, AlexNet全部使用最大池化层 max pooling, 避免了平均池化层的模糊化的效果,并且步长比池化的核的尺寸小,这样池化层的输出之间有重叠,提升了特征的丰富性.

4)提出LRN层,局部响应归一化,对局部神经元创建了竞争的机制,使得其中响应较大的值变得更大,并抑制反馈较小的. (强者更强,弱者更弱)
虽然看网上大家对LRN层的评价都不高,但还是给出一个参考链接:
https://blog.csdn.net/searobbers_duck/article/details/51645941

5)使用了gpu加速神经网络的训练

6)使用数据增强的方法缓解过拟合现象.
数据增强是扩充了样本集,参考链接:
https://www.cnblogs.com/zhonghuasong/p/7256498.html
(个人觉得,GAN也是数据增强的一种方式)

因为我也不是很懂,所以在学习过程中也是查阅各种资料,觉得讲得比较好的链接都附了上来。下一步是弄弄代码吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章