Alexnet网络模型介绍
1、概述
AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经网路被提出,比如优秀的VGG,GoogleNet,resnet。其官方提供的数据模型,准确率达到57.1%,top-5 达到80.2%. 这项对于传统的机器学习分类算法而言,已经相当的出色。
论文原文:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
2、网络结构
整体结构为:
精简版的结构可表示为:
各层的详细描述:
(1)conv1阶段
输入数据:227×227×3
卷积核:11×11×3;步长:4;数量(也就是输出个数):96
卷积后数据:55×55×96 (原图N×N,卷积核大小n×n,卷积步长大于1为k,输出维度是(N-n)/k+1)
relu1后的数据:55×55×96
Max pool1的核:3×3,步长:2
Max pool1后的数据:27×27×96
norm1:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
最后的输出:27×27×96
AlexNet采用了Relu激活函数,取代了之前经常使用的S函数和T函数,Relu函数也很简单:
ReLU(x) = max(x,0)
AlexNet另一个创新是LRN(Local Response Normalization) 局部响应归一化,LRN模拟神经生物学上一个叫做 侧抑制(lateral inhibitio)的功能,侧抑制指的是被激活的神经元会抑制相邻的神经元。LRN局部响应归一化借鉴侧抑制的思想实现局部抑制,使得响应比较大的值相对更大,提高了模型的泛化能力。LRN只对数据相邻区域做归一化处理,不改变数据的大小和维度。LRN概念是在AlexNet模型中首次提出,在GoogLenet中也有应用,但是LRN的实际作用存在争议,如在2015年Very Deep Convolutional Networks for Large-Scale Image Recognition 论文中指出LRN基本没什么用。
AlexNet还应用了Overlapping(重叠池化),重叠池化就是池化操作在部分像素上有重合。池化核大小是n×n,步长是k,如果k=n,则是正常池化,如果 k<n, 则是重叠池化。官方文档中说明,重叠池化的运用减少了top-5和top-1错误率的0.4%和0.3%。重叠池化有避免过拟合的作用。
(2) conv2阶段
输入数据:27×27×96
卷积核:5×5;步长:1;数量(也就是输出个数):256
卷积后数据:27×27×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu2后的数据:27×27×256
Max pool2的核:3×3,步长:2
Max pool2后的数据:13×13×256 ((27-3)/2+1=13 )
norm2:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
最后的输出:13×13×256
在AlexNet的conv2中使用了same padding,保持了卷积后图像的宽高不缩小。
(3)conv3阶段
输入数据:13×13×256
卷积核:3×3;步长:1;数量(也就是输出个数):384
卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu3后的数据:13×13×384
最后的输出:13×13×384
conv3层没有Max pool层和norm层
(4)conv4阶段
输入数据:13×13×384
卷积核:3×3;步长:1;数量(也就是输出个数):384
卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu4后的数据:13×13×384
最后的输出:13×13×384
conv4层也没有Max pool层和norm层
(5)conv5阶段
输入数据:13×13×384
卷积核:3×3;步长:1;数量(也就是输出个数):256
卷积后数据:13×13×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu5后的数据:13×13×256
Max pool5的核:3×3,步长:2
Max pool2后的数据:6×6×256 ((13-3)/2+1=6 )
最后的输出:6×6×256
conv5层有Max pool,没有norm层
(6)fc6阶段
输入数据:6×6×256
全连接输出:4096×1
relu6后的数据:4096×1
drop out6后数据:4096×1
最后的输出:4096×1
AlexNet在fc6全连接层引入了drop out的功能。dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率(一般是50%,这种情况下随机生成的网络结构最多)将其暂时从网络中丢弃(保留其权值),不再对前向和反向传输的数据响应。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而相当于每一个mini-batch都在训练不同的网络,drop out可以有效防止模型过拟合,让网络泛化能力更强,同时由于减少了网络复杂度,加快了运算速度。还有一种观点认为drop out有效的原因是对样本增加来噪声,变相增加了训练样本。
(7)fc7阶段
输入数据:4096×1
全连接输出:4096×1
relu7后的数据:4096×1
drop out7后数据:4096×1
最后的输出:4096×1
(8)fc8阶段
输入数据:4096×1
全连接输出:1000
fc8输出一千种分类的概率。
3、AlexNet与在其之前的神经网络相比改进
(1)数据增广(Data Augmentation增强)
常用的数据增强的方法有 水平翻转、随机裁剪、平移变换、颜色、光照、对比度变换。 增强图片数据集最简单和最常用的方法是在不改变图片核心元素(即不改变图片的分类)的前提下对图片进行一定的变换,比如在垂直和水平方向进行一定的平移,翻转等。
AlexNet用到的第一种数据增益的方法:是原图片大小为256 * 256中随机的提取224 * 224的图片,以及他们水平方向的映像。
第二种数据增益的方法就是在图像中每个像素的R、G、B值上分别加上一个数,用到 方法为PCA。对于图像每个像素,增加以下量 :
pi 是特征向量,λi是特征值,αi是N(0,0.1)高斯分布中采样得到的随机值。此方案名义上得到自然图像的重要特性,也就是说,目标是不随着光照强度和颜色而改变的。此方法将top-1错误率降低了1%。
(2) Dropout
有效防止过拟合。结合多个模型的预测值是减少错误的有效方法,但是对于训练时间用好几天的大型神经网络太耗费时间。Dropout是有效的模型集成学习方法,具有0.5的概率将隐藏神经元设置输出为0。运用了这种机制的神经元不会干扰前向传递也不影响后续操作。因此当有输入的时候,神经网络采用不同的结构,但是这些结构都共享一个权重,这就减少了神经元适应的复杂性。测试时,用0.5的概率随机失活神经元。dropout减少了过拟合,也使收敛迭代次数增加一倍。
(3) Relu激活函数
用ReLU代替了传统的simod或者T激活函数,使得训练更快。一般神经元的激活函数会选择sigmoid函数或者tanh函数,然而Alex发现在训练时间的梯度衰减方面,这些非线性饱和函数要比非线性非饱和函数慢很多。在AlexNet中用的非线性非饱和函数是f=max(0,x),即ReLU。实验结果表明,要将深度网络训练至training error rate达到25%的话,ReLU只需5个epochs的迭代,但tanh单元需要35个epochs的迭代,用ReLU比tanh快6倍。
(4)Local Response Normalization 局部响应归一化
参考了生物学上神经网络的侧抑制的功能,做了临近数据归一化,提高来模型的泛化能力。ReLU本来是不需要对输入进行标准化,但本文发现进行局部标准化能提高性能。
其中a代表在feature map中第i个卷积核(x,y)坐标经过了ReLU激活函数的输出,n表示相邻的几个卷积核。N表示这一层总的卷积核数量。k, n, α和β是hyper-parameters,他们的值是在验证集上实验得到的,其中k = 2,n = 5,α = 0.0001,β = 0.75。这种归一化操作实现了某种形式的横向抑制,这也是受真实神经元的某种行为启发。
(5)Overlapping Pooling 重叠池化
重叠池化减少了系统的过拟合,分别将top-5和top-1的错误率减少了0.4%和0.3%。pooling层是相同卷积核领域周围神经元的输出。池化层可以被认为是由间隔s个像素的池化单元网格组成,每个池化单元概括了以池化单元的位置为中心的大小z×z的邻域。然而,Alex说还有的情况,也就是带交叠的Pooling,顾名思义这指Pooling单元在总结提取特征的时候,其输入会受到相邻pooling单元的输入影响,也就是提取出来的结果可能是有重复的(对max pooling而言)。而且,实验表示使用 带交叠的Pooling的效果比的传统要好,在训练阶段有避免过拟合的作用。
(6)多GPU并行训练
AlexNet将网络分成了上下两部分,两部分的结构完全一致,这两部分由两块不同的GPU来训练,提高了训练速度。为提高运行速度和提高网络运行规模,作者采用双GPU的设计模式。并且规定GPU只能在特定的层进行通信交流。其实就是每一个GPU负责一半的运算处理。与在一个GPU上训练的每个卷积层有一半核的网络比较,该方案将我们的top-1与top-5误差率分别减少了1.7%与1.2%。值得注意的是,虽然one-GPU网络规模只有two-GPU的一半,但其实这两个网络其实并非等价的。
Alexnet模型代码参考:
- github代码:https://github.com/stephen-v/tensorflow_alexnet_classify
- 对应上述的github代码详解:https://www.cnblogs.com/vipyoumay/p/7686230.html
- github代码2:https://github.com/kratzert/finetune_alexnet_with_tensorflow(不过没有验证模型代码,模型构建和训练跟上述基本一致)
其他可学习链接:
- AlexNet详细解读(本文第三部分描述参考来源):https://blog.csdn.net/qq_24695385/article/details/80368618
- Alexnet解读:https://blog.csdn.net/u014135752/article/details/79978097
- Alexnet原文翻译:https://blog.csdn.net/hit2015spring/article/details/53649183
Alexnet网络模型介绍相关推荐
- 使用pytorch搭建AlexNet网络模型
使用pytorch搭建AlexNet网络模型 AlexNet详解 AlexNet是2012年ISLVRC 2012(ImageNet Large Scale Visual Recognition Ch ...
- KVM虚拟化技术之virt-manager使用及KVM虚拟化平台网络模型介绍
一.使用virt-manager创建和管理虚拟机 1.使用VNC Viewer连接进入虚拟化平台主机 2.打开终端输入virt-manager命令启动virt-manager虚拟机管理界面 #virt ...
- 【图像分类】卷积神经网络之AlexNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)
写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌. 在上一篇博文中我们对AlexNet网络模型的结构 ...
- K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍
Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...
- Alexnet网络模型在cifar-10数据集上的实现(基于tensorflow-gpu)
最近根据github和tensoflow源代码中的关于Alexnet的一些代码,完成了一个在cifar-10训练集上进行训练和测试的Alexnet模型(算是半抄半改吧,哈哈!!).实现在测试集上的ac ...
- AlexNet网络介绍
本文转自红黑联盟https://www.2cto.com/kf/201608/533035.html 1LeNet-5 1.1局限性 早在1989年,Yann LeCun (现纽约大学教授)和他的同事 ...
- AlexNet网络模型
2012年,Hinton的学生 Alex Krizhevsky在< 深度卷积神经网络的ImageNet分类>一文中提出了深度卷积神经网络模型 AlexNet,是LeNet的一种更深更宽的版 ...
- Leader/Follower多线程网络模型介绍
之前分享过<轻量级web server Tornado代码分析>,介绍了目前我们采用nginx + tornado的方式搭建升级.配管.数据中心等各类服务组建客户端迭代体系.最近注意 ...
- 卷积神经网络之AlexNet网络模型学习
ImageNet Classification with Deep Convolutional Neural Networks 论文理解 在ImageNet LSVRC-2010上首次使用大型深度卷 ...
最新文章
- vuecli 编译后部署_基于vue-cli 打包时抽离项目相关配置文件详解
- 实时智能决策引擎在蚂蚁金服风险管理中的实践
- 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
- encache学习教程
- JS正则表达式元字符
- 微信支付java helloworld_10行代码搞定微信支付(Java版)
- ubuntu 20.04修改数据源配置
- 理解php中的yield
- 从有界到无界,腾讯新一代企业网引领安全创新
- Qt文档阅读笔记-QVariant::value()与qvariant_cast解析及使用
- magento 输出关联产品
- 支持百万级TPS,Kafka是怎么做到的?
- PHP一阶段 html+css+js 练习题汇总
- C/C++ 工具函数 —— 大端模式和小端模式的互换
- 常用的英文文献引用格式
- Bus Hound错误提示解释
- 分享一下我制作的Bat批处理程序-PC Tools(含源码)
- codeforces 136A(Presents) Java
- 英特尔计划发布代号为Spring Crest的神经网络处理器芯片,测试部署AI模型速度更快
- 微信小店和微信小商店的区别?如何建立怎么开通?
热门文章
- Mac 抓包工具Charles4破解版,安装使用
- Vue拖拽组件开发实例
- matlab已知圆心和半径怎么作圆,matlab根据圆心和半径画圆三种方式
- Java语言,有n个人围成一圈,顺序排号1...n。从第一个人开始报数(从1到3报数),凡报到3的人立刻退出圈子,输入参数为n,计算并返回最后留下的是第几号。
- 南京计算机考研培训,南京考研培训班十大靠谱排名
- 成为08奥运的志愿者
- Android入门第1天-Android Studio的安装
- 【opencv-c++】cv::calcHist计算直方图
- 严寒中传递温暖 回家路油站相伴
- SpringMVC通过拦截URL控制Mybatis切换数据源