卷积神经网络之AlexNet网络详解

2023-05-16

一  介绍

Alex Krizhevsky等人训练了一个大型的卷积神经网络用来把ImageNet LSVRC-2010比赛中120万张高分辨率的图像分为1000个不同的类别。在测试卷上,获得很高准确率(top-1 and top-5 error rates of 37.5%and 17.0% ).。通过改进该网络,在2012年ImageNet LSVRC比赛中夺取了冠军,且准确率远超第二名(top-5 test error rate of 15.3%,第二名26.2%。这在学术界引起了很大的轰动,开启了深度学习的时代,虽然后来大量比AlexNet更快速更准确的卷积神经网络结构相继出现,但是AlexNet作为开创者依旧有着很多值得学习参考的地方,它为后续的CNN甚至是R-CNN等其他网络都定下了基调,所以下面我们将从AlexNet入手,理解卷积神经网络的一般结构。

AlexNet网络包括了6000万个参数和65000万个神经元,5个卷积层,在一些卷积层后面还有池化层,3个全连接层,输出为 的softmax层。

 

二 数据集

实验采用的数据集是ImageNet。ImageNet是超过1500万个标记的高分辨率图像的数据集,大约有22,000个类别。这些图像是从网上收集的,并使用亚马逊的Mechanical Turk众包服务进行了标记。从2010年开始,举办ILSVRC比赛,数据使用的是ImageNet的 一个子集,每个类别大约有1000个图像,总共有1000个类别。总共有大约120万个训练图像,50000个验证图像,以及150000个测试图像。ImageNet比赛给出两个错误率,top-1和top-5,top-5错误率是指你的模型预测的概率最高的5个类别中都不包含正确的类别。ImageNet由可变分辨率的图像组成,而神经网络输入维度是固定的。 因此,我们将图像下采样到256×256的固定分辨率矩形图像,我们首先重新缩放图像,使短边长度为256,然后从结果图像中裁剪出中心256×256的图片。 我们没有预先处理图像以任何其他方式,我们在像素的原始RGB值上训练了我们的网络。

 

三 ReLU激活函数

在此之前,神经元的激活函数一般选择sigmoid或者tanh,然而在该论文中选择的是ReLU(修正线性单元),用这个激活函数其训练速度要比传统的神经网络快几倍,4层的卷积神经网络在CIFAR-10数据集上测试,当训练集 的错误率达到25%时,使用ReLU的速度要比tanh快6倍,如下图所示 :

 

四 局部归一化( Local Response Normalization)

AlexNet在激活函数之外又使用了局部归一化,公式如下:

其中a_{x,y}^{i}表示第i个卷积在(x,y)产生的值然后应用ReLU激活函数的结果,n表示相邻的几个卷积核,N表示这一层总的卷积核数量。k,n,α,β都是超参数,他们的值是在验证集实验上得到的,k=2,n=5,α=1e-4,β=0.75.这种归一化操作实现了某种形式的横向抑制,这也是真实神经元的某种行为启发。这种具有对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得更大,而对响应比较小的值更加加以抑制,从而增强模型的泛化能力,这和让更加明显的特征更加明显,很细微不明显的特征加以抑制是一个道理。

后来证明该步骤起到的作用很小,所以后来就很少使用。

 

五 重叠pooling(overlap pooling)

通常情况下,在卷积神经网络中我们设置池化层参数为步幅s=2,窗口大小f=2,这相当于对图像进行下采样,而AlexNet使用了重叠的池化层,设置s=2,f=3。在这以前大部分是使用平均池化,到了Alexnet中就全部使用最大池化(max pool),这可以很好的解决平均池化的模糊问题。同时Alexnet提出让卷积核扫描步长比池化核的尺寸小,这样在池化层的输出之间会有重叠和覆盖,在一定程度上提升了特征的丰富性。

 

六 网络结构

AlexNet总共包含8层,5个卷积层,3个全连接层,输出 为1000个类别的softmax层。如下图所示:

从图上可以明显看到网络结构分为上下两侧,这是因为网络分布在两个GPU上,这种药是因为NVIDIA GTX 580 GPU只用3GB内存,装不下那么大的网络。为了减少GPU之间的通信,第2,4,5个卷积层只连接同一个GPU上的上一层的kernel map(指和卷积核相乘后得到的矩阵)。第三个卷积层连接第二层的所有的kernel map。全连接的神经元连接到上一层的所有神经元。第1,2个卷积层里ReLU操作后轴LRN操作。第1,2,5卷积层卷积之后进行max pooling操作。ReLU激活函数应用于所有的卷积层和全连接层。

在AlexNet中,我们标记5个卷积层依次2为C1,C2,C3,C4,C5。而每次卷积后的结果在上图中可以看到,比如经过卷积层C1后,原始的图像变成了55x55的尺寸,一共有96个通道,分布在2张3G的显卡上,所以上图中一个立方体的尺寸是55x55x48,48是通道数目(后面会详细的说明),而在这个立方体里面还有一个5x5x48的小立方体,这个就是C2卷积层的核尺寸,48是核的厚度(后面会详细说明)。这样我们就能看到它每一层的卷积核尺寸以及每一层卷积之后的尺寸。我们按照上面的说明,推到下每一层的卷积操作:

需要说明的是,虽然AlexNet网络都用上图的结构来表示,但是其实输入图像的尺寸不是224x224x3,而应该是227x227x3,大家可以用244的尺寸推导下,会发现边界填充的结果是小数,这显然是不对的,在这里就不做推导了。

AlexNet各个层的参数和结构如下:

输入层:227x227x3 
C1:96x11x11x3 (卷积核个数/高/宽/深度) 
C2:256x5x5x48(卷积核个数/高/宽/深度)
C3:384x3x3x256(卷积核个数/高/宽/深度)
C4:384x3x3x192(卷积核个数/高/宽/深度)
C5:256x3x3x192(卷积核个数/高/宽/深度)

更详细的结构如下:

1.推导下C1后的输出是什么:

227x227x3的输入图像和卷积核11x11x3做卷积运算,步长为s=4,卷积后的尺寸是55x55x1。因为:(227-11+2*0)/4+1=55 。一共有96个卷积核,最后的输出:55x55x48x2。(图上之所以看起来是48个是由于2个GPU服务器处理,每个服务器承担了48个)

使用ReLU激励函数,然后还有个LRN标准化处理。

然后经过了一个最大池化层,池化层参数f=3,s=2.所以我们得到27x27x48x2的输出。27是是由(55-3)/2+1计算得到的。

2.推导下C2后的输出是什么:

27x27x48x2的输入,卷积核为5x5x48,。这是因为第1个卷积共有96个卷积核,第2个卷积核的尺寸应该为5x5x96,但是第一层的kernel maos分布在两个GPU上,且第二个卷积层只连接同一个GPU上的上一个网络,所以卷积核的尺寸为5x5x48。padding=2,s=1,(same卷积)经过卷积运算,卷积后的尺寸是27x27x1。因为:(27-5+2*2)/1+1=27 。一共有256个卷积核, 最后的输出:27x27x128x2。

使用ReLU激励函数,然后还有个LRN标准化处理。

然后经过了一个最大池化层,池化层参数f=3,s=2.所以我们得到13x13x128x2的输出。13是是由(27-3)/2+1计算得到的。

3.推导下C3后的输出是什么:

13x13x256的输入,卷积核为3x3x256,padding=1,s=1(same卷积)经过卷积运算,卷积后的尺寸是13x13x1。因为:(13-3+2*1)/1+1=13 。一共有384个卷积核, 最后的输出:27x27x192x2。

使用ReLU激励函数,不过C3层没有使用池化层和LRN。

4.推导下C4后的输出是什么:

13x13x192x2的输入,卷积核为3x3x192,padding=1,s=1(same卷积)经过卷积运算,卷积后的尺寸是13x13x1。因为:(13-3+2)/1+1=13 。一共有384个卷积核, 最后的输出:13x13x192x2。

使用ReLU激励函数,不过C4层没有使用池化层和LRN。

5.推导下C5后的输出是什么:

13x13x192x2的输入,卷积核为3x3x192,padding=1,s=1(same卷积)经过卷积运算,卷积后的尺寸是13x13x1。因为:(13-3+2)/1+1=13 。一共有个256卷积核, 最后的输出:13x13x128x2。

使用ReLU激励函数,不过C5层没有LRN.

然后经过了一个最大池化层,池化层参数f=3,s=2.所以我们得到6x6x256的输出。6是是由(13-3)/2+1计算得到的。

6.推导下FC6后的输出是什么:

这里使用4096个神经元,对256个大小为6X6特征图,进行一个全链接,卷积核为6x6x256,一共有4096卷积核。

然后进行一个dropout操作,随机从4096个节点中丢掉一些节点信息。

7.推导下FC7后的输出是什么:

这里和FC6是类似的。

8.输出层

  • 采用的是1000个神经元,然后对FC7中4096个神经元进行全链接,然后会通过高斯过滤器,得到1000个float型的值,也就是我们所看到的预测的可能性,。
  • 如果是训练模型的话,会通过标签label进行对比误差,然后求解出残差,再通过链式求导法则,将残差通过求解偏导数逐步向上传递,并将权重进行推倒更改,类似与BP网络思虑,然后会逐层逐层的调整权重以及偏置.

 由于上面网络是分布在两个GPU上面,看起来有些凌乱,因此我们把AlexNet网络整合在一块,如下:

  • AlexNet 首先用一张 227×227×3 的图片作为输入,实际上原文中使用的图像是 224×224×3,但是如果你尝试去推导一下,你会发现 227×227 这个尺寸更好一些。
  • C1 第一层我们使用 96 个11×11 的过滤器,步幅为 4,由于步幅是 4,因此尺寸缩小到 55×55,缩小了 4 倍左右。然后用一个 3×3 的过滤器构建最大池化层,f=3,s=2,尺寸缩小为 27×27×96。
  • C2 接着再执行一个 5×5 的same卷积, p=3,s=1,输出是 27×27×256。然后再次进行最大池化,尺寸缩小到 13×13。
  • C3 再执行一次 same 卷积,p=1,s=1,得到的结果是 13×13×384, 384 个过滤器。
  • C4 再做一次 same 卷积,p=1,s=1,得到的结果是 13×13×384, 384 个过滤器。
  • C5 再做一次 same 卷积,p=1,s=1,得到的结果是 13×13×256。最后再进行一次最大池化,尺寸缩小到 6×6×256。
  • 6×6×256 等于 9216,将其展开为 9216 个单元,然后是一些全连接层。最后使用 softmax 函数输出识别的结果。

 

七 防止过拟合

1.增加图片数据集(Data Augmentation)

  • 对图片进行变化,例如裁切,缩放,翻转等。
  • 在图片每个像素的RGB值上加入一个偏移量,使用主成分分析方法处理。将每个像素的RGB_{x,y}=[R_{x,y},G_{x,y},B_{x,y}]加上下面的值:

其中P_{i}\lambda _{i}分别是RGB值3x3协方差矩阵的第i个特征向量和特征值。\alpha_{i}是一个服从均值0,标准差为0.1的高斯分布的随机变量,在训练一张图片之前生成,同一张图片训练多次会生成多次。这两个矩阵相乘,得到一个3x1的矩阵。

这种方法将top-1错误率减少了1%。

2.Dropout

dropout是以一定的概率使神经元的输出为0,AlexNet设置概率为0.5,这种技术打破了神经元之间固定的依赖,使得学习到的参数更加健壮。AlexNet在第1,2个全连接网络中使用了dropout,这使得迭代收敛的速度增加了一倍。

 

八 训练学习

该模型训练使用了随机梯度下降法,每批图片有180张,权重更新公式如下:

其中i是迭代的索引,v是动量,0.9是动量参数,ε是学习率,0.0005是权重衰减系数,在这里不仅起到正则化的作用,而且减少了模型的训练误差。是这一批图片代价函数对权重w的偏导数。

所有的权重都采用均值为0,方差为0.01的高斯分布进行初始化。第2,4,5卷积层和所有全连接层的偏置都初始化为1,其他层的偏置初始化为0.学习率ε=0.01,所有层都使用这个学习率,在训练过程中,当错误率不在下降时,将学习率除以10,在终止训练之前减少3次,我们把120万张图片训练了90遍,总过花费了5到6天。

参考文章

[1]从AlexNet理解卷积神经网络的一般结构

[2]AlexNet 网络详解及Tensorflow实现源码

[3]神经网络模型之AlexNet的一些总结

[4]lenet-5,Alexnet详解以及tensorflow代码实现

[5]【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet(推荐)

 

 

-----------------------------------------------------------------------------------------------------------------------

原文:https://www.cnblogs.com/zyly/p/8781224.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卷积神经网络之AlexNet网络详解 的相关文章

  • k8s安装flannel组件出错

    安装完flannel组建后 xff0c 查看pod xff0c 显示Error 查看log 提示 xff1a Error registering network failed to acquire lease subnet 34 10 24
  • openjdk下载与安装

    openjdk下载与安装 官方网站和文档参考 http openjdk java net install 安装说明 http jdk java net 11 openjdk下载地址
  • DirectUI简介

    DirectUI界面库 取名自微软的一个窗口类名 DirectUIHWND xff0c 意为Paint on parent dc directly 即子窗口不以窗口句柄的形式创建 xff0c 只是逻辑上的窗口 xff0c 绘制在父窗口之上
  • 机器学习 之 Haar特征

    Haar特征 Haar特征原理综述 Haar特征是一种反映图像的灰度变化的 xff0c 像素分模块求差值的一种特征 它分为三类 xff1a 边缘特征 线性特征 中心特征和对角线特征 用黑白两种矩形框组合成特征模板 xff0c 在特征模板内用
  • Linux下将c++转换为so文件并利用python调用

    C 43 43 转so文件 这里以简单的加法为例 xff0c 代码如下 xff0c add传入两个int的参数 xff0c 完成加法 主函数main调用add xff0c return结果 这里需要注意的点在于 xff0c 不能忘记将函数添
  • Oracle的rollup、cube、grouping sets函数

    Oracle的rollup cube grouping sets函数 Oracle的group by除了基本用法以外 xff0c 还有3种扩展用法 xff0c 分别是rollup cube grouping sets 1 rollup 假设
  • 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类 一 无条件跳转 JMP 二 根据 CX ECX 寄存器的值跳转 JCXZ CX 为 0 则跳转 JECXZ ECX 为 0 则跳转 三 根据 EFLAGS 寄存器的标志位跳转 这个太多了 根据标志位跳转的指令 JE 等于则跳
  • 中标麒麟yum源的问题以及 mips64el.rpm和.noarch.rpm 不同 openjdk1.8安装

    1 一开始发现yum源地址不对 xff0c 访问不了 xff0c 进行了修改 ns7 adv os name 61 NeoKylin Linux Advanced Server 7 Os baseurl 61 http download c
  • 多任务学习(Multi-Task Learning, MTL)

    目录 显示 1 背景2 什么是多任务学习 xff1f 3 多任务学习如何发挥作用 xff1f 3 1 提高泛化能力的潜在原因3 2 多任务学习机制3 3 后向传播多任务学习如何发现任务是相关的4 多任务学习可被广泛应用 xff1f 4 1
  • Zhong__一文通透Casbin

    时间 xff1a 2021 12 06 环境 xff1a Windows 目的 xff1a Casbin简介与使用 希望对大家有帮助 说明 xff1a 以官方文档为基础来讲解与拓展详解 xff0c 并最终帮助大家在项目中使用 xff01 本
  • Linux多线程调度策略

    转自 xff1a http blog csdn net byperseverance article details 44522731 Linux线程的调度策略分为3个 xff1a SCHED OTHER xff0c SCHED FIFO
  • HDFS操作语句

    HDFS操作语句 本地交互 上传重命名 xff1a hdfs dfs put xx csv srv bigdata xxxx csv 上传 xff1a hdfs dfs put xx csv srv bigdata 强制上传 xff1a h
  • 【ubuntu】Ubuntu 各版本代号简介

    一 版本及代号说明 Ubuntu中 xff0c 每个版本都有一个更为特色的名字 xff0c 这个名字由一个形容词和一个动物名称组成 xff0c 并且 xff0c 形容词和名词的首字母都是一致的 Ubuntu版本的命名规则是根据正式版发布的年
  • 一行代码加速你的Pandas数据探索分析

    本文3分钟 xff0c 大幅提升分析数据效率 我们知道 xff0c pandas库为EDA提供了许多非常有用的功能 但是 xff0c 在能够应用大多数功能之前 xff0c 通常必须先从更通用的功能开始 xff0c 例如df describe
  • 无需虚拟机或双系统!Windows下愉快地使用Linux子系统

    文章目录 说明一 启用 适用于Linux的Windows子系统 WSL 二 启用开发人员模式三 下载linux安装包相关深入学习Ubuntu子系统的资料参考资料 本文阅读3分钟 xff0c 你将获得如下方案 xff0c 在轻量使用场景下 x
  • 解决GitHub的raw.githubusercontent.com无法连接问题

    问题描述 xff1a Ubuntu下连接raw githubusercontent com失败 wget https raw githubusercontent com madmashup targeted marketing predic
  • k2pdfopt详细教程-让kindle看遍所有pdf

    pdf拿什么拯救6寸kindle救世主登场一步一步解决图文混排扫描版pdf 书籍总结 pdf xff0c 拿什么拯救6寸kindle kindle现在已经出道paperwhite第三代了 xff08 2015年7月 xff09 xff0c
  • 图像处理PSNR及其计算(OpenCV和matlab实现)

    图像PSNR及其计算OpenCV和matlab实现 PSNR的概念PSNR编程实现 matlab实现 第一种实现方法第二种直观方法第三种实现方法 OpenCV实现 参考资料 图像PSNR及其计算 xff08 OpenCV和matlab实现
  • Caffe技巧之使用snapshot来继续网络训练

    Caffe技巧之使用snapshot来继续网络训练 Caffe技巧之使用snapshot来继续网络训练 Step 1设置solverprototxtStep 2设置运行脚本sh 有时候想在已经训练好的网络上继续之前的训练 xff0c 那么可
  • 鸿蒙最新功能及承载设备详解:HarmonyOS 2及华为全场景新品发布会全纪录

    6月2日 xff0c 华为联手CSDN直播了 HarmonyOS 2及华为全场景新品发布会 xff0c 老猿全程观看直播 xff0c 并进行了回看 xff0c 力争将发布会的核心内容在本文中概要性地呈现 一 一生万物 万物归一 首先是华为消

随机推荐

  • python删除网页html元素

    找到标签id 以id来删除 js span class token operator 61 span span class token string 39 var child 61 document getElementById 34 ex
  • 10.面向对象分析OOA笔记

    文章目录 概述需求陈述建立对象模型典型步骤 建立动态模型典型步骤 建立功能模型数据流图画法 定义服务 概述 识别出问题域内的类和对象 xff0c 分析它们之间的关系 xff0c 建立问题域的正确模型 三种模型中 xff0c 对象模型是最重要
  • 12.软件项目管理笔记

    文章目录 估算软件规模代码行技术KLOC功能点技术FP 估算工作量进度计划人员组织质量保证软件配置管理能力成熟度模型CMM 估算软件规模 代码行技术KLOC xff08 最小规模平均值a 43 4 最可能规模平均值 43 最大规模平均值b
  • 0.各种规格描述技术总结

    文章目录 结构化分析与设计面向对象分析与设计软件项目管理 结构化分析与设计 系统流程图 xff1a 描绘物理系统 E R图 xff1a 数据模型 层次方框图 xff1a 描绘数据结构 xff0c 数据模型 Warnier图 xff1a 描绘
  • 如何更改Git的端口号

    方法一 直接修改URL为SSH 开头 打开gitbash xff0c 进入仓库 xff0c 输入指令 xff1a git remote set url origin ssh git 64 domain com 1234 home git Y
  • vtk多平面重建(MPR)源码

    include 34 vtkSmartPointer h 34 include 34 vtkActor h 34 include 34 vtkCamera h 34 include 34 vtkCellPicker h 34 include
  • 0.1 + 0.2 不等于0.3 问题,精度的丢失和解决办法

    10个0 1相加不等于1 xff1b 这是因为浮点数精度丢失的问题 xff0c 首先知道在计算机中数字是以二进制的方式存在的 xff0c 那么在CPU中计算0 1 43 0 1时实际上是0 1的二进制的相加 xff1b xff08 0 1
  • Raspberrypi 3 系统备份还原, 基于最小系统镜像实现

    Raspberrypi 3 备份还原系统 一 为什么要备份系统 xff1f 1 经常在树莓派上调试程序 xff0c 安装各种软件 xff0c 越来越多的库和程序的安装带来的系统更改几乎是不可逆的 xff0c 一旦某个程序或者驱动出现问题 x
  • OpenStack(Kilo) + Tenant-OVS-VXLAN(ml2) + Multi-Ext-Net

    from http blog sina com cn s blog 6de3aa8a0102vl7m html 使用VirualBox创建CentOS7虚拟机 资源分配视宿主windows而定 xff0c 由于要部署OpenStack xf
  • 利用策略模式优化if-else

    一 定义 策略模式 Strategy Pattern 策略模式属于对象的行为模式 其用意是针对一组算法 xff0c 将每一个算法封装到具有共同接口的独立的类中 xff0c 从而使得它们可以相互替换 策略模式使得算法可以在不影响到客户端的情况
  • web技术分享| 【高德地图】实现自定义的轨迹回放

    实现 轨迹回放 方式有两种 xff1a 第一种是使用 JS API 和 AMap PolyLine xff08 折线 xff09 等图形配合实现 第二种是使用 JS API 和 AMapUI 组件库 配合使用 xff0c 利用 PathSi
  • ubuntu14.04 忘记了普通用户密码和root密码

    步骤一 xff1a 必须先找回ROOT xff0c 才可以往下做 本文使用的Ubuntu版本为14 04 4 xff0c 具体过程如下为 xff1a 1 重启电脑长按shift键直到进入下图进入GRUB引导模式 xff0c 选择第二行Ubu
  • 乐优商城介绍

    1 乐优商城介绍 1 1 项目介绍 乐优商城是一个全品类的电商购物网站 xff08 B2C xff09 用户可以在线购买商品 加入购物车 下单 秒杀商品可以品论已购买商品管理员可以在后台管理商品的上下架 促销活动管理员可以监控商品销售状况客
  • 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠 34 34 替换成空字符串 34 34 xff0c 结果出现如下的异常 xff1a 1 java util regex PatternSyntaxException Un
  • 正则表达式匹配引号中间的内容怎么写?

    字符串 123 abc 456 匹配结果 abc Answer1 利用先行和后发断言规则 xff1a lt 61 34 61 34 最近总结了一篇关于正则表达式的博文 xff0c 题主不妨一读 xff1a 正则表达式基础 测试代码如下 xf
  • excel将一个工作表根据条件拆分成多个工作表图文教程

    本例介绍在excel中如何将一个工作表根据条件拆分成多个工作表 注意 xff1a 很多朋友反映sheets i delete这句代码出错 xff0c 要注意下面第一个步骤 xff0c 要拆分的数据工作表名称为 数据源 xff0c 而不是你新
  • python3下cv2.imwrite存储带有中文路径

    由于imwrite前使用编码在python3中已经不适用 xff0c 可用imencode代替 xff0c 以下代码是从视频中获取第2帧保存在中文文件夹下的实例 xff1a cap 61 cv2 VideoCapture 34 mp4 34
  • tf.placeholder、feed_dict用法说明

    函数形式 xff1a tf placeholder dtype shape 61 None name 61 None 参数 xff1a dtype xff1a 数据类型 常用的是tf float32 tf float64等数值类型 shap
  • sess.run()

    函数 xff1a run fetches feed dict 61 None options 61 None run metadata 61 None 当构建完图后 xff0c 需要在一个session会话中启动图 xff0c 第一步是创建
  • 卷积神经网络之AlexNet网络详解

    一 介绍 Alex Krizhevsky等人训练了一个大型的卷积神经网络用来把ImageNet LSVRC 2010比赛中120万张高分辨率的图像分为1000个不同的类别 在测试卷上 xff0c 获得很高准确率 top 1 and top