查看原文
其他

从AlexNet剖析-卷积网络CNN的一般结构

张旭 机器学习算法工程师 2019-03-28

作者:张旭    

     编辑:王抒伟




  本文4794字27图,阅读约11分钟  


算了

想看多久看多久





参考目录

一、卷积层

        1.CNN中卷积层的作用

        2.卷积层如何工作

        3.AlexNet中的卷积层

二、池化层与激活层

        1.池化层

        2.激活层

三、全连接层

        1.全连接层的作用

        2.AlexNet中的全连接层

四、Softmax层

        1.Softmax的作用

        2.AlexNet中的Softmax

五、AlexNet中60M参数

六、CNN的发展


背景:

2012年AlexNet在ImageNet大赛上一举夺魁,虽然后来大量比AlexNet更快速更准确的卷积神经网络结构相继出现,但是AlexNet作为开创者依旧有着很多值得学习参考的地方,所以下面我们将从AlexNet开刀,理解卷积神经网络的一般结构。


先看看AlexNet的一些参数和结构图: 
卷积层:5层 
全连接层:3层 
深度:8层 
参数个数:60M 
分类数目:1000类

结构图:



由于当时的显卡容量问题,AlexNet 的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式,其中在C3,R1,R2,R3层上出现交互,所谓的交互就是通道的合并,是一种串接操作。 





卷积层:

   1.CNN中卷积层的作用

    

CNN中的卷积层,在很多网络结构中会用conv来表示,也就是convolution的缩写。


卷积层在CNN中扮演着很重要的角色——特征的抽象和提取,这也是CNN区别于传统的ANN或SVM的重要不同,在传统机器学习算法中,我需要人为的指定特征是什么

比如经典的HOG+SVM的行人检测方案,HOG就是一种特征提取方法。


所以我们送入SVM分类器中的其实HOG提取出来的特征,而不是图片的本身,所以有时特征提取算法的选择会比分类模型更为重要。


而在CNN中,特征提取的工作在卷积层自动完成了,越深越宽的卷积层一般来说就会有更好的表达能力,所以CNN是一种端对端的训练,我们输入的就是原始的数据,而不是人工提取的特征.


从这个角度上再思考一步的话,其实CNN可以看做一个自学习的特征提取+softmax分类器(这里暂不考虑全连接的逻辑判断层,因为在后来他就被取消了)。



 2.卷积层如何工作:


CNN中的卷积层操作与图像处理中的卷积是一样的,都是一个卷积核对图像做自上而下,自左而右的加权求和操作,不同之处在于,在传统图像处理中,我们人为指定卷积核,比如Soble,我们可以提取出来图像的水平边缘和垂直边缘特征。

而在CNN中,卷积核的尺寸是人为指定的,但是卷积核内的数全部都是需要不断学习得到的。

比如一个卷积核的尺寸为3*3*3,分别是宽,高和厚度,那么这一个卷积核中的参数有27个。 

在这里需要说明一点: 

卷积核的厚度=被卷积的图像的通道数 
卷积核的个数=卷积操作后输出的通道数 

这两个等式关系在理解卷积层中是非常重要的!!

举一个例子,输入图像尺寸5*5*3(宽/高/通道数),卷积核尺寸:3*3*3(宽/高/厚度),步长:1,边界填充:0,卷积核数量:1。

用这样的一个卷积核去卷积图像中某一个位置后,是将该位置上宽3,高3,通道3上27个像素值分别乘以卷积核上27个对应位置的参数,得到一个数,依次滑动,得到卷积后的图像,这个图像的通道数为1(与卷积核个数相同),图像的高宽尺寸如下公式: 
(5-3+2*0)/1 +1 = 3 
所以,卷积后的特征尺寸为:3*3*1(宽/高/通道数)

 3.AlexNet中的卷积层:


在AlexNet中,卷积层是上图所示的C1…..C5,一共5层。而每次卷积后的结果在上图中可以看到,比如经过卷积层C1后,原始的图像变成了55*55的尺寸,一共有96个通道,分布在2张3G内存的显卡上

所以上图中一个立方体的尺寸是55*55*48,48是通道数目(后面会详细的说明).而在这个立方体里面还有一个5*5*48的小立方体,这个就是C2卷积层的核尺寸,48是核的厚度(后面会详细说明)。

这样我们就能看到它每一层的卷积核尺寸以及每一层卷积之后的尺寸。我们按照上面的说明,推导下每一层的卷积操作:

输入层:224*224*3 
C1:96*11*11*3 (卷积核个数/宽/高/厚度) 
C2:256*5*5*48(卷积核个数/宽/高/厚度) 
C3:384*3*3*256(卷积核个数/宽/高/厚度) 
C4:384*3*3*192(卷积核个数/宽/高/厚度) 
C5:256*3*3*192(卷积核个数/宽/高/厚度)

 

针对这五层卷积,说明一下三点: 
1.推导下C1后的输出是什么: 
用11*11*3的卷积核卷积224*224*3的图像,卷积后的尺寸是55*55*1。

因为:(224-11+3)/4+1=55 


卷积核的个数为96,但是48个在一张显卡上,剩余48个在另一张显卡上。

所以单张显卡上的通道数为48,2为显卡个数。 


最后的输出:55*55*48*2 
而剩下的层数与上述推导式相同的,我们可以逐层确定输出是什么。

 
2.注意推导过程中的池化操作:
在C1,C2,C5的卷积操作后,图像做了最大池化(后面会说),这会影响输出图片的尺寸。 
3.C3卷积层的特殊性:

看下上面这张图,由于分显卡操作,上一层的输出通道数(也就是卷积核的个数)总会是下一层卷积层卷积核厚度的2倍。

但是C3是特殊的,这是为啥呢????? 

因为在这里做了通道的合并,也就是一种串接操作,所以一个卷积核卷积的不再是单张显卡上的图像,而是两张显卡的图像串在一起之后的图像,串在一起之后的通道数就是256,所以卷积核的厚度为256。 

这也就是为什么,在这个图上要画两个3*3*128的卷积核,他想表达的意思就是实际的卷积核尺寸是3*3*256!(上面这个结论是个人理解)




池化层与激活层:


严格上说池化层与激活层不属于CNN中的单独的层,也不记入CNN的层数内,所以我们一般直说AlexNet一共8层,有5层卷积层与3层全连接层。


但是在这里为了逻辑上清晰,就把他们单独拿出来说明下


1.池化层


池化操作(Pooling)用于卷积操作之后,其作用在于特征融合和降维,其实也是一种类似卷积的操作,只是池化层的所有参数都是超参数,都是不用学习得到的。


上面这张图解释了最大池化(Max Pooling)的操作过程,核的尺寸为2*2,步长为2,最大池化的过程是将2*2尺寸内的所有像素值取最大值,作为输出通道的像素值。 


除了最大池化外,还有平均池化(Average Pooling),也就是将取最大改为取平均。 


一个输入为224*224*64的图像,经过最大池化后的尺寸变为112*112*64,可以看到池化操作的降维改变的是图像的宽高,而不改变通道数。

2.激活层

池化操作用于卷积层内,而激活操作则在卷积层和全连接层都会用到,在这里只简单说明下,具体内容大家可以在 理解激活函数在神经网络模型构建中的作用这个博客中了解。 
深层网络中一般使用ReLU多段线性函数作为激活函数,如下图所示,其作用在于增加非线性。 


在全连接层中的激活过程就很好理解了,因为全连接层内所有的神经元的输出都是一个数,只要这个数x>0,则x=x;x<0,则x=0。 


在卷积层中的激活针对的是每一个像素值,比如某卷积层输出中某个通道中i行j列像素值为x,只要这个数x>0,则x=x;x<0,则x=0。



全连接层:


1.全连接层的作用

CNN中的全连接层与传统神经网络中的作用是一样的,负责逻辑推断,所有的参数都需要学习得到。


有一点区别在于第一层的全连接层用于链接卷积层的输出,它还有一个作用是去除空间信息(通道数),是一种将三维矩阵变成向量的过程(一种全卷积操作),其操作如下: 

输入图像是W*H*C,那么卷积核的尺寸为W*H*C,这样的话整个输入图像就变成了一个数,一共有k个数(第一层全连接层后的神经元个数),就有K个这样的W*H*C的卷积核。

所以全连接层(尤其是第一层)的参数量是非常可怕的,也是由于这个弊端,后来的网络将全连接取消了,这个有机会再说。

2.AlexNet中的全连接层

再回到AlexNet结构,R1,R2,R3就是全连接层。

R2,R3很好理解,在这里主要说明下R1层: 
输入图像:13*13*256 
卷积核尺寸:13*13*256 个数2048*2 
输出尺寸:4096(列向量) 
从最开始的结构中可以看到,R1中也有通道的交互:
 

所以串接后的通道数是256,全卷积的卷积核尺寸也就是13*13*256,一个有4096个这样尺寸的卷积核分别对输入图像做4096次的全卷积操作,最后的结果就是一个列向量,一共有4096个数。

这些数的排布其实就相当于传统神经网了里面的第一个隐藏层而已,通过R1后,后面的链接方式和ANN就没有区别了。要学习的参数也从卷积核参数变成了全连接中的权系数。



Softmax层:


1.Softmax的作用

Softmax层也不属于CNN中单独的层,一般要用CNN做分类的话,我们习惯的方式是将神经元的输出变成概率的形式,Softmax就是做这个的:

这个很好理解,显然Softmax层所有的输出相加为1。而某一个输出的就是概率,最后我们按照这个概率的大小确定到底属于哪一类。 
 

2.AlexNet中的Softmax

AlexNet最后的分类数目为1000,也就是最后的输出为1000,输入为4096,中间通过R3链接,R3就是最后一层了,全连接的第3层,所有层数的第8层。 
到这里,AlexNet的所有结构就都说完了!说完了!说完了!,下面补充一些东西,算是一些延伸吧。




AlexNet中60M参数:

AlexNet只有8层,但是它需要学习的参数有60000000(看看这数量级)个,相比如他的层数,这是一个很可怕的数字了

我们来计算下这些参数都是怎么来的: 


C1:96*11*11*3(卷积核个数/宽/高/厚度) 34848个 
C2:256*5*5*48(卷积核个数/宽/高/厚度) 307200个 
C3:384*3*3*256(卷积核个数/宽/高/厚度) 884736个 
C4:384*3*3*192(卷积核个数/宽/高/厚度) 663552个 
C5:256*3*3*192(卷积核个数/宽/高/厚度) 442368个 
R1:4096*6*6*256(卷积核个数/宽/高/厚度) 37748736个 
R2:4096*4096 16777216个 
R3:4096*1000 4096000个

在R1中卷积核尺寸是6*6*256而不是13*13*256是因为经过了最大池化。可以看到,全连接层(尤其是第一层)参数数量占了绝大部分。


CNN的发展:

在AlexNet问世之后,CNN以一个很快的速度发展,截止到2016年,已经有了多代的网络结构问世,深度、宽度上也越来越大,效率和正确率上也越来越好: 
LeNet5—AlexNet—NiN—VGG—GoogleNet—ResNet —DenseNet
在这些结构中: 

NiN 引入1*1卷积层(Bottlenecklayer)和全局池化;
VGG将7*7卷积核替换成3个3*3卷积核,起到了降参数的作用; 
GoogLeNet引入了Inception模块;
ResNet引入了残差思想;

DenseNet在ResNet的直连思想基础上,又做了进一步改进,将当前层的输出特征向之后所有的层做直连。


其中有些网络去除了AlexNet中提出的一些思想,比如全连接层,全尺寸卷积等等,但是AlexNet,甚至是更之前的LeNet5对CNN发展有着里程碑式的意义。 





PS:

如果你懂一些ANN相关知识,更好喔,如果你不懂,留言给小编,小编给你好好打一下基础。




多谢大家支持公众号


关于本文CNN相关知识和其他问题

欢迎大家加群在群中探讨

欢迎留言或赞赏。




阅 


  1. 学好机器学习,这里有你需要的一切

  2. 趣谈深度学习核心----激活函数

  3. 朴素贝叶斯实战篇之新浪新闻分类

  4. Object Detection R-CNN





扫描燕哥微信号

拉你进机器学习大牛群。

福利满满,名额已不多…


目前80%的AI从业者已关注我们微信公众号

       

       

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存