一个深度学习痴呆选手对AlexNet网络架构的一些理解
最近开始入坑深度学习,之前根本没接触过关于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,他与 LeCun和Bengio并称神经网络领域三巨头(吊炸了!!)。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网络架构的一些理解相关推荐
- 深度学习入门笔记之ALexNet网络
Alex提出的alexnet网络结构模型,在imagenet2012图像分类challenge上赢得了冠军.作者训练alexnet网络时大致将120万张图像的训练集循环了90次,在两个NVIDIA G ...
- 深度学习案例2:AlexNet网络识别14种鲜花
1 AlexNet简介 AlexNet在[ImageNet Classification with Deep Convolutional Neural Networks]论文中提出的,并在ILSVRC ...
- 深度学习输入模式与适当的网络架构之间的对应关系
向量数据:密集连接网络(Dense层). 图像数据:二维卷积神经网络. 声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络. 文本数据:一维卷积神经网络(首选)或循环神经网络. 时间序列数据 ...
- 万字长文带你看尽深度学习中的各种卷积网络
来源:AI科技评论 摘要:深度学习中的各种卷积网络大家知多少? 深度学习中的各种卷积网络大家知多少?对于那些听说过却又对它们没有特别清晰的认识的小伙伴们,这篇文章非常值得一读.Kunlun Bai 是 ...
- TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发
TorchFusion 是一个深度学习框架,主要用于 AI 系统加速研究和开发. TorchFusion 基于 PyTorch 并且完全兼容纯 PyTorch 和其他 PyTorch 软件包,它供了一 ...
- 【深度学习】像素级分割网络新思路之DeepLabv3+
[深度学习]像素级分割网络新思路之DeepLabv3+ 1 版本情况 2 引言&相关工作 3 空洞卷积(Dilated/Atrous Convolution) 4 DeepLabv3+ 5 深 ...
- 从头搭建一个深度学习框架
从头搭建一个深度学习框架 转自:Build a Deep Learning Framework From Scratch 代码:https://github.com/borgwang/tinynn 当 ...
- 【转】[caffe]深度学习之图像分类模型AlexNet解读
[caffe]深度学习之图像分类模型AlexNet解读 原文地址:http://blog.csdn.net/sunbaigui/article/details/39938097 本文章已收录于: 深 ...
- 哪些深度相机有python接口_用树莓派和YOLO打造一个深度学习照相机
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 亚马逊刚刚发布了一款智能摄像头DeepLens,它使用机器学习来检测物体.面部和一些活动,如弹吉他.虽然现 ...
最新文章
- 无连接的用户数据报协议UDP
- 前端dashboard框架_微前端在网易七鱼的实践
- python加法赋值运算符为_Python学习-算术运算符,赋值运算符和复合运算符
- DataTable的AcceptChange方法为什么不能在Update之前?
- 抽象类实例化 使用原功能 c++_java 学习笔记 day08 final/static关键字、抽象类和接口...
- 在iOS8 下用Swift 创建自定义的键盘
- 编程:休息片刻的好处
- 韩国成功研发变色龙软体机器人;曝新iPhone将推出摄影版“人像模式”;Android 12 Beta 4发布|极客头条...
- 森林结点数,边数与树个数的关系
- 怎样保证linux内核安全性,技术|如何做好 Linux 内核安全处理
- mysql test run_MySQL自动测试框架
- linux 中文ssid 显示乱码,把中文SSID变成乱码!一切正常了?_网络设备-中关村在线...
- C语言编程练习---2021山东理工大学ACM 实验一J---X题解
- JS数值类型与字符串类型的内置方法
- 跟“杀熟”说再见 在熊拍拍只有双赢
- 研究生阶段如何学习、做研究(超棒)
- 5.docker image (镜像)
- 工业互联网体系架构、类型及应用
- 陈莉君教授: 回望踏入Linux内核之旅(下篇)
- Ubuntu新建用户后使用sudo报错:不在sudoers文件中,此事将被报告