经典卷积神经网络AlexNet原理详细介绍

2023-11-18

 

《ImageNet Classification with Deep Convolutional Neural Networks》

这篇文章的网络是在2012年的ImageNet竞赛中取得冠军的一个模型整理后发表的文章。作者是多伦多大学的Alex Krizhevsky等人。AlexNet是由Alex Krizhevsky 提出的首个应用于图像分类的深层卷积神经网络。在这之前,常见的第一个CNN网络结构LeNet5并不被人所熟知,本文所提出的AlexNet才引起了大家对于CNN的注意。在这之后。越来越多更深层次的网络结构被提出,使得CNN成为了成为了图像领域的核心算法。

这篇文章是本人对于这一网络学习之后的一点记录,算是学习笔记,如果有不对之处欢迎大家指正。

1.论文里提出的模型结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6IOW6JmO54ix5a2m5LmgMQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

怎么看这幅图呢?前面是5个卷积层(图示虚线部分所示),后面是三个全连接层(图中实线所示)。首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个GPU,只有到了特定的网络层后才需要两块GPU进行交互,这种设置完全是利用两块GPU来提高运算的效率,其实在网络结构上差异不是很大。对网络细节做一下简单的梳理:

AlexNet共分为8层结构,其中前5层为卷积层,后面3层为全连接层;
AlexNet采用两路GTX 580 3G并行训练;
AlexNet在第2,4,5层均是前一层自己GPU内连接,第3层是与前面两层全连接,全连接是2个GPU。

2.AlexNet的一些亮点

1.AlexNet在双gpu上运行,每个gpu负责一半网络的运算.训练速度得到提升,大概是使用CPU的20~50倍;

2.激活函数使用了非线性非饱和的ReLU函数,而不是传统的非线性饱和函数(如sigmoid函数,tanh函数),在训练阶段梯度衰减更快;

3.采用局部响应归一化(LRN)。对于非饱和函数ReLU来说,不需要对其输入进行标准化,而ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化。也就是Local Response Normalization(LRN),形成横向抑制,提升泛化能力。论文作者发现进行局部标准化能提高性能,但之后又说作用不大。。

4.池化采用overlapping pooling。即池化窗口的大小大于步长,使得每次池化都有重叠的部分。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。论文说,在训练模型过程中,覆盖的池化层更不容易过拟合;

5.训练时使用Dropout随机失活一部分神经元,以避免模型过拟合,论文作者主要是在最后几个全连接层使用了Dropout,因为全连接层的参数更多;

6.数据增强,防止过拟合的最简单的方法,对原始数据进行适当变换,就会得到更多有差异的数据集,防止过拟合。论文提到的两种方法:镜像反射和随机剪裁。随机剪裁是原图片以及他们水平方向的映像大小为256*256中随机提取224*224的图片。

3.模型结构详解

介绍模型结构前先给出经卷积核卷积后的矩阵大小计算公式:

gif.latex?N%3D%5Ctfrac%7BW-F+2P%7D%7BS%7D+1

padding后矩阵大小的两种计算公式: 

padding=‘VALID:gif.latex?N%3D%5Cfrac%7BW-F+1%7D%7BS%7D’[向上取整]

 

padding=‘same:’gif.latex?N%3D%5Cfrac%7BW%7D%7BS%7D[向上取整]

W:输入图片大小W*W

F:卷积核大小F*F

S:步长stride

P:padding

 

5380bf9c30f4104a1acbaf12a6b4c0c8.png

第一层卷积 

第一层输入数据为原始的227*227*3的图像,这个图像被kernel_size=11*11*3的卷积核进行卷积运算,卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长strides=4。因此,卷积核在移动的过程中会生成55个像素。共有96个卷积核,会生成55*55*96个卷积后的像素层。96个卷积核分成2组,每组48个卷积核。对应生成2组55*55*48的卷积后的像素层数据,这些像素层经过ReLU处理,生成激活像素层,尺寸仍为2组55*55*48的像素层数据。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为27*27*96。这96层像素层分为2组,每组48个像素层,每组在一个独立的GPU上进行运算。

第二层卷积 

第二层输入数据为第一层输出的27*27*96的像素层,为便于后续处理,padding=[2,2],即每幅像素层的左右两边和上下两边都填充2个像素;27*27*96的像素数据分成27*27*48的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=5*5的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成27个像素,共有256个5*5的卷积核;这256个卷积核分成两组,每组针对一个GPU中的27*27*48的像素进行卷积运算。会生成两组27*27*128个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸仍为两组27*27*128的像素层。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为2组13*13*128的像素层,这256层像素层分为2组,每组128个像素层每组在一个GPU上进行运算。

第三层卷积

第三层输入数据为第二层输出的13*13*256的像素层,为便于后续处理,padding=[1,1],即每幅像素层的左右两边和上下两边都填充1个像素;13*13*256的像素数据分成13*13*128的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=3*3的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成13个像素,共有384个3*3的卷积核;这256个卷积核分成两组,每组针对一个GPU中的13*13*128的像素进行卷积运算。会生成两组13*13*192个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸为两组13*13*192的像素层。

第四层卷积

第四层输入数据为第三层输出的13*13*384的像素层,为便于后续处理,padding=[1,1],即每幅像素层的左右两边和上下两边都填充1个像素;13*13*394的像素数据分成13*13*192的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=3*3的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成13个像素,共有384个3*3的卷积核;这256个卷积核分成两组,每组针对一个GPU中的13*13*192的像素进行卷积运算。会生成两组13*13*192个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸为两组13*13*192的像素层。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为2组13*13*128的像素层,这256层像素层分为2组,每组128个像素层每组在一个GPU上进行运算。

第五层卷积

第五层输入数据为第四层输出的13*13*384的像素层,为便于后续处理,padding=[1,1],即每幅像素层的左右两边和上下两边都填充1个像素;13*13*384的像素数据分成13*13*192的两组像素数据,两组数据分别再两个不同的GPU中进行运算。每组像素数据被kernel_size=3*3的卷积核进行卷积运算。卷积核沿原始图像的x轴方向和y轴方向两个方向移动,移动的步长为stride=1。因此,卷积核在移动的过程中会生成13个像素,共有256个3*3的卷积核;这256个卷积核分成两组,每组针对一个GPU中的13*13*192的像素进行卷积运算。会生成两组13*13*128个卷积后的像素层。这些像素层经过ReLU处理,生成激活像素层,尺寸为两组13*13*128的像素层。

池化运算,max_pooling, pool_size = (3, 3), stride = 2,池化后像素的规模为2组6*6*128的像素层,这256层像素层分为2组,每组128个像素层每组在一个GPU上进行运算。

第六层全连接

第六层输入数据的是6*6*256的像素层,采用6*6*256尺寸的滤波器对第六层的输入数据进行卷积运算,每个滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果,共有4096个6*6*256的滤波器对输入数据进行卷积运算,通过4096个神经元输出运算结果,这4096个运算结果通过ReLU激活函数生成4096个值,并通过dropout运算后输出4096个本层的输出结果值。由于第六层的运算过程中,采用的滤波器的尺寸(6*6*256)与待处理的feature map的尺寸(6*6*256)相同,即滤波器中的每个系数只与feature map中的一个像素值相乘;而其它卷积层中,每个滤波器的系数都会与多个feature map中像素值相乘;因此,将第六层称为全连接层。

 第七层全连接

第六层输出的4096个数据与第七层的4096个神经元进行全连接,然后经由ReLU进行处理后生成4096个数据,再经过dropout处理后输出4096个数据。

 第八层全连接

第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出被训练的数值。最终输出softmax为1000,因为ImageNet这个比赛的分类个数为1000。

4.AlexNet为啥取得比较好的结果

  • ReLU(Rectified Linear Units) f(x)=max(0,x)。基于ReLU的深度卷积网络比基于tanh的网络训练块衰减快数倍,下图是一个基于CIFAR-10的四层卷积网络在tanh和ReLU达到25%的training error的迭代次数:(图片来自于网络。侵删)

eab72f63ca297bea772df54484e4c58a.png

实线、间断线分别代表的是ReLU、tanh的training error,可见ReLU比tanh能够更快的收敛。 

 

  • LRN公式如下:

7a18705048974cd760760b0748b2615b.png

ReLU输出的结果和它周围一定范围的邻居做一个局部的归一化。(图片来自于网络。侵删)

  • Dropout

在神经网络中Dropout通过修改神经网络本身结构来实现。对于某一层神经元,通过定义的概率来随机删除一些神经元,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新,下一次迭代中,重新随机删除一些神经元,直至训练结束(图片来自于网络。侵删)。

dc733a6dc471efef754183ddee82ff9f.png

  • Data Augmentation(图像增强)

防止模型过拟合的最简单的方法之一是增加数据,但是其实增加数据也是有策略的,论文从256*256中随机提出227*227的数据,还有就是通过PCA(主成分分析)来扩展数据集。

 

 

 

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

经典卷积神经网络AlexNet原理详细介绍 的相关文章

随机推荐

  • CMakeLists.txt指定GCC和g++版本号

    Centos默认的g 版本只有4 8 5一般需要升级g 版本 比如升级9 3 0 升级成功后再使用c 14会报unrecognized command line option std c 14 错误 由于有多个gcc版本 cmake使用的是
  • 向前走

    行脚僧云游山中 目力已经瞥见峰上那风化嶙峋的岩石 许是明日便能行至山顶 脚下不是山脉的主峰 但也是颇具险势 并非泛泛 篝火照耀面庞 在山洞的壁上投出巨大的身影 遁入空门近十载 离寺云游也两三个春秋了 原有些厌世 方才脱发出家 住持常言他有些
  • 「解码AGI 对话大模型」AGI创业者不能错过的五节课!

    由百度飞桨 文心大模型 BV百度风投联合主办 张江集团战略合作的AGI Foundathon 大模型创业松活动于9月11日全面上线 为了进一步提升开发者的创新能力和创业实力 主办方精心策划了全面的线上AGI创业营 本次创业营集创业辅导 技术
  • vue3-styled-components inject导致死循环

    npm vue3 styled components npm 低版本浏览器报错 chrome 49 Uncaught RangeError Maximum call stack size exceeded Vue warn Avoid ap
  • .net 和 java 技术对应关系

    net 和 java 技术对应关系 java 生态的优势早已人尽皆知 asp net core 的生态也呈欣欣向荣之势 作为高级技术从业人 你不应该落下任何一门技术 如果你正在将你的 java 知识体系同步到 net 或者正在将你的 net
  • T-Kernel Data types

    来自 uT Kernel 2 0 Specification 3 1 1 General Data Types typedef signed char B signed 8 bit integer typedef signed short
  • 项目-STL空间配置器

    这篇博客主要讲一下SGI STL中的空间配置器的工作流程 一 项目背景 小块内存带来的内存碎片问题 外碎片问题 小块内存频繁申请释放带来的性能问题 二 空间配置器的思想 对于我们来说 对new和delete很熟悉 这两个函数可以分别完成内存
  • 运放中接电阻的作用

    一 基本概念 运放的基本组成 运算放大器的内部电路结构如下所示 一般由输入段 增益段 输出段等3段电路构成 输入段由差分放大段构成 用于放大两个引脚间的电压差 另外 同相信号成分 引脚间无电位差 输入相等电压的状态 不放大 起抵消作用 若仅
  • 数学期望、信息量、信息熵、相对熵、交叉熵

    1 数学期望 数学期望就是总体的均值 或者各项的加权平均 先看离散的情况 假设X为离散型随机变量 x1 x2 x3 xk为随机变量的所有可能取值 p1 p2 p3 pk为随机变量相应取值发生的概率 其中p1 p2 p3 pk 1 那么随机变
  • 安装gin失败或卡住,亲测有效!

    安装gin失败或卡住 亲测有效 本人基于最近学习完了go所有语法 对go框架进一步学习与实战 但第一步的安装就遇到了坑 也是坑了很久 网上很多的方法 但是都乱七八糟 最主要一点毛线用都没有 柳暗花明又一村 功夫不负有心人 还是让我找到了解决
  • 电阻噪声的基础知识和一个有趣的小测试

    作者 TI 专家 Bruce Trump 翻译 TI信号链工程师 Tom Wang 王中南 放大电路的噪声性能受到输入电阻和反馈电阻Johnson噪声 热噪声 的影响 大多数人似乎都知道电阻会带来噪声 但对于电阻产生噪声的细节却是一头雾水
  • PHP对二维数组里面的多字段进行排序

    PHP对二维数组里面的多字段进行排序
  • 500 G JAVA视频网盘分享(JEECG开源社区)

    500 G JAVA视频网盘分享 JEECG开源社区 涵盖从java入门到深入架构 Linux 云计算 分布式 大数据Hadoop ios Android 互联网技术应有尽有 转载 http blog csdn net zhangdaisc
  • 标识符、变量与赋值语句1

    2 2标识符 变量与赋值语句 2 2 1标识符 标识符就是一个名字 就好像我们每个人都有属于自己的名字 它的主要作用就是作为变量 函数 类 模块以及其他对象的名称 Python 中标识符的命名不是随意的 而是要遵守一定的命令规则 比如说 1
  • delete LEFT JOIN 的一个问题解决办法

    LEFT JOIN 的一个问题解决办法 今天在一个程序后台删除一个东西的时候 却出现了这个问题 Java代码 System Message MySQL Query Error User admin Time 2007 10 20 21 08
  • ubuntu18.04桌面卡住鼠标可以动 键盘失效

    大多数是在启动chrome 或者开机后几分钟内频繁操作 直接卡死 鼠标可以移动但是无法点击 视频播放有声音但画面卡住 键盘在显示界面上没有操作效果 我挂了一晚上还是这样 强制重启 crtl alt prtsc r e i s u b ubu
  • ts中定义类、类的继承、修饰符

    首先 简单介绍ES6的class类 class Foo constructor name age 实例前的构造函数 实例添加name age属性 this name name this age age getName 原型添加getName
  • linux查找postgre进程,postgresql数据库某一个进程占用大量CPU,问题排查详解

    postgresql某一个进程占用大量 CPU 问题排查 目前服务器cpu为4核 内存8G 1 查下是不是我们的业务SQL SELECT procpid START now START AS lap current query FROM S
  • Linux——在Linux系统上安装和启动MinIO

    Linux 在Linux系统上安装和启动MinIO 下载 MinIO 赋予它可执行权限 运行 优化 将 minio 添加成 Linux 的服务 使用 systemctl 启停 minio 下载 MinIO 使用以下命令 将 data 替换为
  • 经典卷积神经网络AlexNet原理详细介绍

    ImageNet Classification with Deep Convolutional Neural Networks 这篇文章的网络是在2012年的ImageNet竞赛中取得冠军的一个模型整理后发表的文章 作者是多伦多大学的Ale