最近开始入坑深度学习,之前根本没接触过关于AI领域的知识,也就对着B站上的CS231N课水了水,但完全就是半懂不懂很懵逼的感觉,毕竟神经网络就类似于一个黑箱,难以理解也是很正常的。现在打算写一篇关于极为经典的AlexNet网络的博客,复现一些知识,也算是做到学以致用。在下初入炼丹领域的小白一枚,望各位大佬指点,感激不尽。

背景

关于卷积神经网络CNN,最早要追溯到LeNet-5这个网络,得益于GPU计算性能的提升以及大规模数据集的出现,AlexNet算是真正引领深度学习的浪潮,2012年的ImageNet LSVRC-2010竞赛的头号玩家。AlexNet作者是多伦多大学的Alex Krizhevsky等人,他在比赛后发表了一篇叫《ImageNet Classification with Deep Convolutional Neural Networks》的文章。Alex Krizhevsky是Hinton的学生,这个团队领导者是Hinton,他与 LeCunBengio并称神经网络领域三巨头(吊炸了!!)。AlexNet在大体结构上与LetNet-5类似,都是先卷积然后再全连接,但细节却大相径庭,AlexNet网络较LeNet-5深,有60 亿个参数和65000个神经元,五层卷积,三层全连接网络,最终的输出层是1000路的softmax,远比LeNeT-5复杂,这就导致了AlexNet有远优于当时其他模型算法的性能,在测试集为top-1(排名第一的类别与实际结果相符的准确率)和top-5(排名前五的类别包含实际结果的准确率)上分别拿到了37.5%和17%的error rates。

网络结构

这是论文里抠下来的网络架构图


论文中,据我们亲爱的Alex Krizhevsky同学说,他们那可怜的GTX 580 GPU(md,一点都不可怜,搜了一下2012年的GTX580少说也得3、4k)只有3GB的内存,无法容纳整个网络,所以他拍了脑瓜,把整个网络一分为二,用两个GTX 580来训练(馋馋),每个显卡装整个网络一半的参数。这种设置是利用两块GPU来提高运算的效率,只有到了特定的网络层后才需要两块GPU进行交互融合。
下面细说一下每层的结构,注意我在这里以整个网络来说,没有将其分为一半

第一层

卷积层,输入是3通道的224X224的图像,采用48X2=96个stride 为4的11X11的卷积核进行卷积,根据公式 output = (input + 2 * padding - kernel_size) / stride + 1 可得 width = height = 54 。然后通过LRN层(局部响应归一化层), 后面跟着池化 pool_size = (3, 3), stride = 2, pad = 0 最终获得第一层卷积的feature map,尺寸为 55X55X96.

第二层

卷积层,输入为上一层卷积的feature map,卷积的个数为256。卷积核的大小为:5×5×48; pad = 2,stride = 1; 然后做 LRN,最后 max_pooling,pool_size = (3, 3), stride = 2.

第三层

卷积层,将第二层的输出作为输入,卷积核个数为384, kernel_size = (3 × 3 × 256), padding = 1,无LRN和Pool

第四层

卷积层,输入为第三层的输出,卷积核个数为384,kernel_size = (3 × 3), padding = 1,无LRN和Pool

第五层

卷积层,输入为第四层的输出,卷积核个数为256,kernel_size = (3 × 3),padding = 1。然后直接进行max_pooling, pool_size = (3, 3), stride = 2;

第六、七、八层

接下来的6、7、8层均为全连接层,第五层输出的66256规模的像素层数据与第六层的4096个神经元进行全连接,然后经由relu进行处理后生成4096个数据,再经过dropout处理后输出4096个数据。第六层输出的4096个数据与第七层的4096个神经元进行全连接,然后经由relu进行处理后生成4096个数据,再经过dropout处理后输出4096个数据。第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出被训练的数值。

值得注意的是,论文中指出,如果去掉任何一个卷积层,都会使网络的分类性能大幅下降,所以下面来描述一下某些层干了什么,有什么作用。

层与层如何各司其职

Local Response Normalization(局部响应归一化)

局部响应归一化层有如下好处:
1.归一化有助于快速收敛;
2.对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
公式为:


论文中最终确定的结果为:

Overlapping Pooling(重叠池化)

在以往的LeNet中池化是不重叠的,即池化的窗口的大小和步长是相等的,而在AlexNet中每次移动的步长小于池化的窗口长宽,使得其池化可以重叠。AlexNet池化的大小为3×3的正方形,每次池化移动步长为2,这样就会出现重叠。重叠池化可以避免过拟合,这个方法减少了0.3%的Top-5错误率。
想要了解更多池化操作,可以看这里:卷积神经网络里的各种池化操作

一些训练与优化的奇技淫巧

数据增益

AlexNet用到的方法:
1、原图片大小为256X256中随机的提取224X224的图片,以及他们水平方向的映像。随机地从256X256的原始图像中截取224X224大小的区域,即四个角上的图像块和中心的图像块,和它们的水平翻转,相当于增加了2X(256-224)^2=2048倍的数据量,使用了数据增强后可以大大减轻过拟合,提升泛化能力。
2、在图像中每个像素的R、G、B值上分别加上一个数,用到方法为PCA。对于图像每个像素,增加以下量 :

p是主成分,lamda是特征值,alpha是N(0,0.1)高斯分布中采样得到的随机值。该方法名义上得到自然图像的重要特性,即目标是不随着光照强度和颜色而改变的。

Dropout

原本的AlexNet网络,如果训练全部神经元,可能会耗费漫长的时间,并且会使得训练完的模型适应力不强,即一个神经元会依赖周边神经元,容易产生过拟合。使用Dropout后,以0.5的概率随机失活神经元,增加了神经元的独立适应性,减少了过拟合,也使收敛迭代次数增加一倍。
想要深入了解Dropout可以看这篇文章:理解Dropout

权重更新

AlexNet用的是随机梯度下降算法来更新权重,动力为0.9,权重衰减为0.005,


其中i是迭代指数,v是动力变量,ε是学习率,是目标关于w、对求值的导数在第i批样例上的平均值。我们用一个均值为0、标准差为0.01的高斯分布初始化了每一层的权重。对所有的层使用相等的学习率,一开始设置学习率0.01,当验证误差在该学习率停止下降时,学习率除以10,同样操作,总共三次
想要知道更多随机梯度下降原理的强迫症同学可以 click here:随机梯度下降与动量详解

实验结果

在ILSVRC-2012比赛中,AlexNet横空出世,震慑八方,威名远扬,远超当时的传统方法:

总结

与过去的卷积神经网络相比,AlexNet可以归纳为以下这些创新点:
(1) 用了两种独特的数据增强。
(2)GPU并行运算,使用两块GTX580显卡,可以直接互相访问显存,不需要通过主机内存。
(3)使用了当时刚提出的dropout技术。
(4)采用了重叠池化。
(5)使用了局部响应归一化。
(6)使用均值为0,标准差为0.01的高斯分布对每一层的权重进行初始化,加速收敛。
(7)权重衰减为0.0005,少量的权重衰减能减少模型训练误差。
(8)对所有的层使用相等的学习率。

AlexNet引发了深度学习浪潮,在计算机算力的加持下,更多人看到了深度学习的可能。以后我会再更新几篇深度学习经典论文的博客,妄求与你们一同进步。

一个深度学习痴呆选手对AlexNet网络架构的一些理解相关推荐

  1. 深度学习入门笔记之ALexNet网络

    Alex提出的alexnet网络结构模型,在imagenet2012图像分类challenge上赢得了冠军.作者训练alexnet网络时大致将120万张图像的训练集循环了90次,在两个NVIDIA G ...

  2. 深度学习案例2:AlexNet网络识别14种鲜花

    1 AlexNet简介 AlexNet在[ImageNet Classification with Deep Convolutional Neural Networks]论文中提出的,并在ILSVRC ...

  3. 深度学习输入模式与适当的网络架构之间的对应关系

    向量数据:密集连接网络(Dense层). 图像数据:二维卷积神经网络. 声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络. 文本数据:一维卷积神经网络(首选)或循环神经网络. 时间序列数据 ...

  4. 万字长文带你看尽深度学习中的各种卷积网络

    来源:AI科技评论 摘要:深度学习中的各种卷积网络大家知多少? 深度学习中的各种卷积网络大家知多少?对于那些听说过却又对它们没有特别清晰的认识的小伙伴们,这篇文章非常值得一读.Kunlun Bai 是 ...

  5. TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发

    TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发. TorchFusion 基于 PyTorch 并且完全兼容纯 PyTorch 和其他 PyTorch 软件包,它供了一 ...

  6. 【深度学习】像素级分割网络新思路之DeepLabv3+

    [深度学习]像素级分割网络新思路之DeepLabv3+ 1 版本情况 2 引言&相关工作 3 空洞卷积(Dilated/Atrous Convolution) 4 DeepLabv3+ 5 深 ...

  7. 从头搭建一个深度学习框架

    从头搭建一个深度学习框架 转自:Build a Deep Learning Framework From Scratch 代码:https://github.com/borgwang/tinynn 当 ...

  8. 【转】[caffe]深度学习之图像分类模型AlexNet解读

    [caffe]深度学习之图像分类模型AlexNet解读 原文地址:http://blog.csdn.net/sunbaigui/article/details/39938097 本文章已收录于:  深 ...

  9. 哪些深度相机有python接口_用树莓派和YOLO打造一个深度学习照相机

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 亚马逊刚刚发布了一款智能摄像头DeepLens,它使用机器学习来检测物体.面部和一些活动,如弹吉他.虽然现 ...

最新文章

  1. 无连接的用户数据报协议UDP
  2. 前端dashboard框架_微前端在网易七鱼的实践
  3. python加法赋值运算符为_Python学习-算术运算符,赋值运算符和复合运算符
  4. DataTable的AcceptChange方法为什么不能在Update之前?
  5. 抽象类实例化 使用原功能 c++_java 学习笔记 day08 final/static关键字、抽象类和接口...
  6. 在iOS8 下用Swift 创建自定义的键盘
  7. 编程:休息片刻的好处
  8. 韩国成功研发变色龙软体机器人;曝新iPhone将推出摄影版“人像模式”;Android 12 Beta 4发布|极客头条...
  9. 森林结点数,边数与树个数的关系
  10. 怎样保证linux内核安全性,技术|如何做好 Linux 内核安全处理
  11. mysql test run_MySQL自动测试框架
  12. linux 中文ssid 显示乱码,把中文SSID变成乱码!一切正常了?_网络设备-中关村在线...
  13. C语言编程练习---2021山东理工大学ACM 实验一J---X题解
  14. JS数值类型与字符串类型的内置方法
  15. 跟“杀熟”说再见 在熊拍拍只有双赢
  16. 研究生阶段如何学习、做研究(超棒)
  17. 5.docker image (镜像)
  18. 工业互联网体系架构、类型及应用
  19. 陈莉君教授: 回望踏入Linux内核之旅(下篇)
  20. Ubuntu新建用户后使用sudo报错:不在sudoers文件中,此事将被报告

热门文章

  1. Matlab与OpenCV对应函数
  2. Linux IPC实践(2) --匿名PIPE
  3. 异常处理:try-catch-finally与throws的区别及使用情况
  4. MogoH5+基于Hbuilder做ios真机测试
  5. iOS 随笔 允许所有不安全网络访问项目
  6. openstack kvm 虚拟机磁盘差异衍生
  7. 阿里云 推荐码   为自己省钱
  8. Java数据结构与算法(26) - ch12堆(堆实现)
  9. SQLSERVER存储过程列名无效的解决方法
  10. ZZULIOJ 1083: 数值统计(多实例测试)