我看AlexNet

作者: MrGiovanni | 来源:发表于2016-05-04 19:53 被阅读38097次

    Author: Zongwei Zhou | 周纵苇
    Weibo: @MrGiovanni
    Email: zongweiz@asu.edu


    Please cite this paper if you found it useful. Thanks!
    Wang H, Zhou Z, Li Y, et al. Comparison of machine learning methods for classifying mediastinal lymph node metastasis of non-small cell lung cancer from 18F-FDG PET/CT images[J]. 2017, 7.


    Reference.

    Krizhevsky A, Sutskever I, Hinton G E. ImageNet Classification with Deep Convolutional Neural Networks [J]. Advances in Neural Information Processing Systems, 2012, 25(2):2012.
    https://code.google.com/p/cuda-convnet/


    说来惭愧,看了深度学习快五个月了,前几周的Paper Review上刚刚注意到AlexNet,那果断用啊,话说LeNet虽然好用,那也是快20年以前的网络结构了,AlexNet是2012年的结构,不管怎么说肯定好呀。贴一张网络结构的历史


    闹,这个AlexNet就是我今天要讲的东西

    AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的,这个网络结构和LeNet有什么区别呢?

    1 卷积神经网络的组成部分

    套路是一样的,先介绍一下深度学习的卷积神经网络(ConvNet)的组成吧。

    1.1 卷积层(Convolutional Layer)

    这个不多说,学过信号的都大概知道卷积是个什么玩意儿,不懂的话可以参考额。。。别参考了,好好学基础知识去吧要说明的一点是这个卷积的过程很好地模拟了人的视觉神经系统的过程,听老师说人眼看东西也就是一个卷积的过程哦,这个我可不能保证哦

    卷积的动态过程

    1.2 降采样层(Pooling Layer)

    降采样就是用一个值来代替一块区域,这个值可以是区域的平均值,最大值,最小值等等,反正有代表性就好了,这个层的目的就是减少数据量。

    降采样过程

    1.3 激活函数层(Activation Layer)

    激活函数的作用是把卷积后的结果压缩到某一个固定的范围,这样可以一直保持一层一层下去的数值范围是可控的。比如一些常见的激活函数

    • sigmoid:控制在[0, 1]
    • tanh:控制在[-1, 1]
    • ReLU:控制在[0, 正无穷]
    • 还有好多新的激活函数,这儿就不举例了,知道它们的作用就OK


      我用的是ReLU激活函数

    1.4 标准化层(Normalization Layer)

    没什么大不了的,就用了个公式来标准化一下

    1.5 全连接层(Full Connected Layer)

    全连接层给人的感觉就是人工神经网络的那样,把所有的网络结点都用一些带权重的值连接起来。这个层一般出现在CNN的后面部分,这个层很长,可以作为图像的特征向量来用,也有论文是把全连接层放到SVM,RF,Adaboost,ANN等传统的分类器里头分类,来代替CNN最后的softmax层,那我也做过这个实验,得到的结果并不好,我不知道这些大牛是怎么弄的。这儿打个问号?

    顾名思义,所有的结点都是连接起来的,这儿的权重会特别多,因为全连接了嘛

    1.6 扔掉层(Dropout Layer)

    这个层我不知道怎么翻,反正作用就是把一些没用的结点给扔掉。

    • 这个思路参考了人的大脑的实际运行状态,研究表明大脑在分析图像的过程中真正被激活的神经元并不多,具体哪些被激活靠得就是先前的学习,和留下来的记忆。那如果没有这个dropout层,我们的CNN在判断所有的图像是相当于所有的结点都激活了,这样和现实的情况不符,所以我们要模拟大脑,把一下没什么用的结点给扔掉。
    • 这个层的作用是加快运算速度,防止过拟合,让网络更加的普适,更加有所谓的“鲁棒性”——装个逼,其实就是更好哈哈:)
    • 实现的方法是设置一个阈值,如果这个结点与结点之间的权重高于这个值,那么说明这是强关系,我们保留,如果权重低于这个值,说明关系不大,我们把它扔掉得了。!!这个实现方法说错了,特别感谢@hzzzol同学的指正,正确的解释应该是:
    • Dropout是在训练过程中以一定概率1-p将隐含层节点的输出值清0,而用bp更新权值时,不再更新与该节点相连的权值。什么意思,就是这个就是个概率问题,和权值的大小,激活程度无关哦,被抽中的结点无条件被丢掉。(Dropout简单理解DropConnect简单理解
    由于权重太多,那我们就把一些没用的扔掉
    • 这个层常常出现在全连接层的地方,因为全连接层中的结点与结点连接太多了,消耗了CNN中绝大多数的内存资源,而这中间有一大部分是没有必要的。


      你看,最后几层多浪费!

    2 LeNet与AlexNet

    以上是对CNN的一个简单的阐述,当然啰,比较琐碎,一个完整的CNN结构是由多个1)卷积层,2)降采样层,3)激活函数层,4)标准化层,5)全连接层和6)扔掉层 有序地拼接而成的,那么又来了这个问题,LeNet和AlexNet的拼法到底有什么不同呢?

    2.1 LeNet

    再次祭出这幅经典的LeNet图

    太经典啦!

    LeNet的成功应用案例是手写字体的识别,就是给一堆手写的阿拉伯数字,用网络来判断这是个什么字。应用的就是当时的邮局等地方,还有门牌号。其实传统的分类器已经可以做到很好的水平了(正确率在96%吧大概),那LeNet作为新起之秀,正确率达到了98%,那在当时就很有名啊,赚了好多好多钱呢,然后卷积神经网络的研究就开始火了呀。到了2012出现AlexNet,以卷积神经网络为核心的深度学习就开始烫了哈哈。
    我们可以看到LeNet中有1)卷积层,2)降采样层(就是Subsampling),和3)全连接层,当然喽,应该是由激活函数层的,只是图中没有画,当时用的应该是sigmoid函数吧,反正现在不用了。你可以发现刚刚提到的扔掉层(dropout)和标准化层没有用诶,为什么呢,因为
    当时还没有这个啊==b
    可以注意到LeNet的

    • 输入尺寸是32*32像素
    • 卷积层:3个
    • 降采样层:2个
    • 全连接层:1个
    • 输出:10个类别(数字0-9的概率)

    然后softmax根据网络输出,也就是这个图像是0-9的概率值大小来判断输入的是多少,比如输出的是个结点,4的值是0.9,其他都是0.001这样的,那么就是说这个输入的图像就是4了,然后根据这个输出的概率,我们可以排列一下输入图像输入某一类的概率值,从大到小,取3个比如,ImageNet竞赛的规则就是这三个里头有一个是对的就当你的网络预测是对的,不然就是预测错误。

    2.2 AlexNet

    我个人的感觉是AlexNet更强调了全连接层的作用,它用了两个全连接层,那么为了减少权重的数目,才引出了dropout这个概念,其他的区别其实不能叫做区别

    • 输入尺寸:227*227像素(因为竞赛的需要)
    • 卷积层:好多(因为输入尺寸的需要)
    • 降采样层:好多(因为输入尺寸的需要)
    • 标准化层:这个反正就是一个公式
    • 输出:1000个类别(因为竞赛的需要)

    这儿要说明一下:不要以为卷积层的个数、降采样层的个数、卷积核的尺寸、卷积核的个数这些网络细节会对最后的训练结果产生什么了不得的影响,这些就按照你的输入图像的尺寸来就行了。没有什么说头,你也可以去参考现在已经有的网络结构去设计,都可以的。这些参数大多都是手动调的,依据就是看看学习的结果如何。

    放一下AlexNet的结构图

    整体AlexNet结构图

    卷积神经网络的结构并不是各个层的简单组合,它是由一个个“模块”有机组成的,在模块内部,各个层的排列是有讲究的。比如AlexNet的结构图,它是由八个模块组成的。

    模块一 模块二

    模块一和模块二是CNN的前面部分,

    卷积-激活函数-降采样-标准化

    构成了一个计算模块,这个可以说是一个卷积过程的标配,CNN的结构就是这样,从宏观的角度来看,就是一层卷积,一层降采样这样循环的,中间适当地插入一些函数来控制数值的范围,以便后续的循环计算。

    模块三、四

    模块三和四也是两个卷积过程,差别是少了降采样,原因就跟输入的尺寸有关,特征的数据量已经比较小了,所以没有降采样,这个都没有关系啦。

    模块五

    模块五也是一个卷积过程,和模块一、二一样事儿的,就是重复重复。好了,可以总结一下,模块一到五其实都是在做卷积运算,根据输入的图像尺寸在适当决定哪几层要用降采样。然后再加上一些必要的函数来控制数值,就可以了。模块五输出的其实已经是6\6的小块儿了(一般我设计都是到1\1的小块,由于ImageNet的图像大,所以6\6也正常的。)
    为什么原来输入的227\
    227像素的图像会变成6\*6这么小呢,主要原因是归功于降采样,当然啰,卷积层也会让图像变小,如图,一层层的下去,图像越来越小

    CNN过程 模块六 模块七、八

    模块六和七就是所谓的全连接层了,全连接层就和人工神经网络的结构一样的,结点数超级多,连接线也超多,所以这儿引出了一个dropout层,来去除一部分没有足够激活的层,其实我记的没错的话这个思想在ANN里头早就有了。
    模块八就是一个输出的结果,结合上softmax做出分类。有几类,输出几个结点,每个结点保存的是属于该类别的概率值。:)


    好了,讲完了,就酱。
    GoogLeNet和VGG我现在还没有看呢,估计应该套路和LeNet和AlexNet差不多,可能网络的深度加了,超大规模的GPU了,或者网络更加精简了,反正整体的思路是不变的,我回头还是要看一看的:)

    相关文章

      网友评论

      • Godwin_211d:文中主观解释太多了。
      • 7ebfd6319c76:全连接层不是3个么?帅气的博主
      • 475a8c8adb86:写得不够严谨啊
        根据ImageNet的维基百科, ImageNet首次提出是在2009年的CVPR会议上。
        Dropout层主要是为了解决过拟合问题,达到类似emsemble的效果。训练时间肯定是更长的,在Alex中的论文中提到训练时间翻了一倍。
        Dropout也不是CNN的必要组成部分。
      • fda89b48da13:您好,您上文说的 不要以为卷积层的个数、降采样层的个数、卷积核的尺寸、卷积核的个数这些网络细节会对最后的训练结果产生什么了不得的影响,这些就按照你的输入图像的尺寸来就行了。 请问您这么说的道理是什么,是您自己的观点还是从哪里看到的。主要试着和我的理解相悖。谢谢
        fda89b48da13:@MrGiovanni 第二天就看到您的回复了,但是当时出差忘了回复您的答复了。十分抱歉,谢谢您的解答了。:yum:
        MrGiovanni:@昕中如止水 这是我快两年前的观点了... 当时没有参考什么,就是做实验的直观感觉。现在多了很多新的网络结构,效果也更好了,你可以对比一下。alexnet算是比较基本的原来级别的模型啦,如果仅仅是改变我提到的那些参数,那就是vgg或者ZF Net。
      • 爱学习的张悠南:楼主写的很好,学习了!
      • cf0798d99e20:写的真详细!!正在学deep learning 很有帮助啊!!想请教一个特别naive的问题从6*6*256 到full connected layer的4096是个什么过程?是单纯的吧每一个pixel都排成一行么(那样不就是9216(6*6*256))。。同理4096最后又是怎么到1000的呢?谢谢楼主:stuck_out_tongue_closed_eyes:
        82644183499f:最近也在看这个东西,我的理解是, 先用6*6的卷积核卷积成向量,然后就像普通的神经网络一样每一个神经元与前面的全连接,这一层有多少个神经元是自己定义的,与前面的形状并无太大的关系,这个地方取4096是为了便于GPU并行计算,最后1000个也是这样子的,与前面的形状没有必然的关系。
      • 一朵西:厉害了。:+1:
        MrGiovanni:@一朵西 所以你是西瓜精吗?:hushed:
      • a9a9336d5ab3:想问一下,在第一个卷积层的时候,第一层的时候输入是三通道,卷积模版是96个,那意思是输入图片的每个通道只与32个模版进行卷积吗?如果都和96个卷积那结果不就是96*3=288了吗?
        MrGiovanni:@amznero 谢谢!
        a9a9336d5ab3:@MrGiovanni 我今天突然搜到一个帖子,他讲的LeNet里面的结构,卷积的时候并不是随机卷积的过程,对我挺有启发的,http://m.blog.csdn.net/article/details?id=50605340给你也看看,共同学习:grin:
        MrGiovanni:@amznero 你的这个问题好难哦,我的理解是每个通道与32个模板里面随机卷积,所以不是严格的96*3的关系。
      • 曹博博:附送一张Alexnet的图
        http://www.jianshu.com/p/687d95657254
        caffe自带的工具生成的
      • 8d47c696c5d8:楼主说的在卷积层以后你一般弄成的都不是1*1的小块,这样做效果好吗?我的图像才48*48,都不敢多弄几层卷积层,要不最后留下的都太小了。
        MrGiovanni:@越长大越闹应 在全连接层以前其实不需要把它弄成1*1的,48*48的输入你少弄几个pooling层就好了呀
      • aa1c3007b037:想请教一下楼主,是否有LeNet的相关实现文档,有可操作性的,先谢谢了。
        MrGiovanni:@曹博博 Thank you!
        曹博博:http://adilmoujahid.com/posts/2016/06/introduction-deep-learning-python-caffe/ 这个教程比较详细 可以用来上手
        MrGiovanni:@牧点点 LeNet结构比较简单,你可以自己写,不过网上应该有写好的结构,你可以直接拷贝网络结构部分的代码
      • 35c5e1142cb1:图很漂亮 啥画的 :kissing_closed_eyes:
        MrGiovanni:@tianlianhpp ppt:relieved:
      • 81ab198fb35c:Dropout 层的原理写错了,建议lz看下 Hinton 12年的文章
        6fd051a14b54:同觉得。。。楼主对dropout层理解并不好。。。
        MrGiovanni:@hzzzol 已经改正,谢谢你了
        MrGiovanni:@hzzzol 谢谢提醒,我会去好好考证的 :smiley:

      本文标题:我看AlexNet

      本文链接:https://www.haomeiwen.com/subject/wezrrttx.html