李沐 X 动手学深度学习--第七章 现代卷积神经网络

embedded/2024/12/19 22:09:06/

导入:本章介绍的神经网络是将人类直觉和相关数学见解结合后,经过大量研究试错后的结晶。本章按时间顺序介绍这些模型,在追寻历史的脉络的同时,帮助培养对该领域发展的直觉(炼丹的直觉),这有助于研究开发自己的架构。

深度卷积神经网络(AlexNet)

  • 经典机器学习的流水线:
  1. 获取一个有趣的数据集(在早期,收集这些数据集需要昂贵的传感器)(在当时最先进的图像也就100万像素)
  2. 根据光学,几何学,其他知识以及偶然的发现(原来炼丹早就有啊,哈哈哈),手工对特征数据集进行预处理
  3. 通过标准的特征提取算法,eg:SIFT(尺度不变特征变换),SURF(加速鲁棒特征)或其他手动调整的流水线来输入数据
  4. 将提取的特征送入最喜欢的分类器中(eg:线性模型/其他核方法),以训练分类器。

学习表征

CV研究人员认为推动领域进步是数据特征而不是学习算法,从对最终模型精度的影响来说,更大/更干净的数据集或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。

另一个预测这个领域发展的方法---观察图像特征的提取方法。

图像特征提取方法的历史:

  • 2012年前,图像特征都是机械地计算出来的;SIFT,SURF,HOG(定向梯度直方图)和类似的特征提取方法占据了主导地位
  • 而包括Yann LeCun,Geoff Hinton,Yoshua Bengio,Andrew Ng, Shun ichi Amari和Juergen Schmidhuber在内的另一组研究人员认为:特征本身应该被学习;在合理的复杂性前提下,特征应该由多个共同学习的神经网络层组成,每个层都有可学习的参数。在机器视觉中,最底层可能检测边缘,颜色和纹理。
  • 在2012年ImageNet挑战赛中,Alex Krizhevsky, Ilya Sutskever和Geoff Hinton提出了一种新的卷积神经网络变体AlexNet,AlexNet在这个比赛中取得了轰动一时的成绩
  • 在AlexNet网络最底层,模型学习到了一些类似传统滤波器的特征抽取器,下图是AlexNet第一层学习到的特征抽取器

 AlexNet的更高层建立在这些底层表示的基础上,以表示更大的特征,eg:眼睛,鼻子,草叶等等;更高层的可以检测整个物体,eg:人,飞机,狗或飞盘;最终的隐藏神经元可以学习图像的综合表示,使属于不同类别的数据易于区别

尽管一直有一群执着的searcher不断钻研,试图学习视觉数据的逐级表征,但是很长一段时间这些尝试都未有突破(这就是所谓的不可解释性吧)。

深度卷积神经网络的突破出现在2012年,可归因于2个关键因素:

  1. 数据:包含许多特征的深度模型需要大量有标签数据,才能显著优于基于凸优化的传统方法,但是,早期计算机存储有限,90年代研究预算有限,大部分研究只能基于小的公开数据集。这一状况在2010年前后兴起的大数据浪潮中得到改善:2009年ImageNet数据集发布。
  2. 硬件:深度学习需要GPU的原因:深度学习对计算资源要求很高,训练可能需要数百个迭代轮数,每次迭代都需要通过代价高昂的许多线性代数层传递数据。  GPU的优点:1,加速图形处理;2,可优化高吞吐量的 4 x 4矩阵和向量乘法,以服务于基本的图形任务;3,这些数学运算与卷积层的计算惊人的相似, NVIDIA和ATI就开始为通用计算操作优化gpu,甚至把它们作为通用GPU来销售。
  •   了解CPU和GPU:
  • CPU:
  • CPU的每个核心:高时钟频率的运行能力,高达数MB的三级缓存(L3Cache);~功能:非常适合执行各种指令,具有分支预测器,深层流水线,其他使CPU能够运行各种程序的功能;致命缺点:通用核心的制造成本非常高,需要大量的芯片面积,复杂的支持结构(内存接口,内核之间的缓存逻辑,高速互连等等);在任何单个任务上的性能都相对较差(现代笔记本电脑最多有4核,即使是高端服务器也很少超过64核,因为性价比不高)
  • GPU:
  • 由100~1000个小的处理单元组成(NVIDIA,ATI,ARM和其他芯片供应商之间的细节稍有不同),通常被分成更大的组(NVIDIA称之为warps)。ps:虽然每个GPU核心都相对较弱,有时甚至以低于1GHz的时钟频率运行,但庞大的核心数量使GPU比CPU快几个数量级原因是:1,功耗往往会随着时钟频率呈二次方增长,如果一个CPU核心运行速度比GPU快4倍,但可以使用16个GPU核代替,那么GPU的综合性能就是CPU的16 x 1/4 = 4 倍。2,GPU内核更简单,使得GPU更节能。3,深度学习中的许多操作需要相对较高的内存带宽,而GPU拥有10倍于CPU的带宽

回到2012年的重大突破,当AlexKrizhevsky和Ilya Sutskever实现了可以在GPU硬件上运行的深度卷积神经网络时,一个重大突破出现了。他们意识到卷积神经网络中的计算瓶颈:卷积和矩阵乘法,都是可以在硬件上并行化的操作。于是,他们使用两个显存为3GB的NVIDIAGTX580 GPU实现了快速卷积运算。他们的创新cuda-convnet89几年来它一直是行业标准,并推动了深度学习热潮。

AlexNet

  • 它首次证明了学习到的特征可以超越手工设计的特征,一举打破计算机视觉研究的现状
  • 下图是一个稍微精简版的AlexNet(去除了当年需要2个小型GPU同时运算的设计特点):

模型设计细节

  • AlexNet的第一层:卷积窗口的形状是11 x 11 (因为ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,所以第一层的卷积窗口比较大)
  • AlexNet的第二层:卷积窗口的形状是 5 x 5
  • AlexNet剩下的层:卷积窗口的形状是 3 x 3
  • 在第一层,第二层,第五层卷积层之后,加入窗口形状为 3 x 3,步幅为2的最大汇聚层
  • 在最后一个卷积层后有2个全连接层,分别有4096个输出,这2个全连接层共拥有将近1GB的模型参数
  • 早期GPU显存有限,原版的AlexNet采用双数据流设计,使得每个GPU只负责存储和计算模型的一半参数,现在,GPU显存相对充裕,所以现在很少需要跨GPU分解模型
  • AlexNet通过暂退法控制全连接层的模型复杂度
  • AlexNet在训练时增加了大量的图像增强数据,eg:翻转,裁切,变色;进一步扩充数据,使得模型更健壮,更大的样本量有效减少了过拟合
  • 激活函数:使用ReLU激活函数,原因如下:
  1. 计算更简单,不需要如sigmoid激活函数那样复杂的求幂运算
  2. 当使用不同的参数初始化方法时,ReLU激活函数使模型训练更加容易
  3. ReLU激活函数在正区间的梯度总是1

小知识:

  • AlexNet通过Sequentical顺序控制全连接层的模型复杂度dropout,而LeNet只使用权重衰减
  • 为了进一步增强数据,AlexNet的训练循环添加了大量的图像增强,eg:翻转,剪切和颜色变化(这样,可以使得模型更稳健,样本量更大,有效减少过拟合)
  • AlexNet有个致命的缺点:最后2个隐藏层太大了,支出就大,故而被后来的框架取代
  • 具体代码如下:

 

使用块的网络(VGG)

  • 牛津大学的视觉几何组的VGG网络是第一个使用块的想法
  • 经典卷积神经网络的基本组成部分(是下面这个序列):
  1. 带填充以保持分辨率的卷积层
  2. 非线性激活函数,eg:ReLU
  3. 汇聚层,eg:最大汇聚层
  • 一个VGG块和经典卷积神经网络类似:第一部分:一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层;第二部分:全连接层组成  
  • 在最初的VGG论文中,作者使用了带有3 x 3卷积核,填充为1(保持高度和宽度)的卷积层,带有 2 x 2 汇聚窗口,步幅为2(每个块后的分辨率减半)的最大汇聚层
  • VGG网络架构

  • 原始VGG网络架构:5个卷积块
  • 前2个块,各有一个卷积层,后三个块各包含2各卷积层
  • 第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,知道该数字达到512
  • 该VGG也被称为VGG-11,因为该网络使用8个卷积层,3个全连接层
  • 具体代码如下: 

网络中的网络(NiN)

  • NiN思想:在每个像素位置(针对每个高度和宽度)应用一个全连接层,将空间维度中的每个像素视为单个样本,将通道维度视为不同特征(feature)
  • 下图是VGG和NiN及它们的块之间主要架构差异

含并行连结的网络(GoogleLeNet) 

  • GoogleLeNet在NiN的基础上做了改进: NiN的串联网络思想+使用不同大小的卷积核组合 ,连接了多分支卷积

(本节介绍的是一个稍微简化的GoogleLeNet版本)

  • 在GoogLeNet中,基本的卷积块:Inception块(Inception block)
  • 下图是Inception块的架构:

  • 对上述架构的解释:
  1. 前三条路径使用卷积层:从不同空间大小中提取信息
  2. 中间2条路径在输入上执行 1x1卷积:减少通道数
  3. 第4条路径使用1x1卷积层:改变通道数
  4. 4条路径都使用了合适的填充使输入和输出的高和宽一致
  5. 在Inception块中超参数是:每层输出通道数
  6. 具体代码如下:

  •  GoogleNet模型架构如下:

小结:

  • Inception块相当于一个有4条路径的子网络,它通过不同窗口形状的卷积层和最大汇聚层,并行抽取信息,使用1x1卷积层减少每像素级别上的通道维数,降低模型复杂度
  • GoogLeNet的Inception块中的通道数分配之比是在ImageNet数据集上,通过大量实验得来的
  •  GoogLeNet和它的后继者们一度是mageNet上最有效的模型之一:它以较低的计算复杂度提供了类似的测试精度。

批量规范化(Batch Normalization)

  • batch normalization可以加速深层网络的收敛速度。
  • 需要 batch normalization的原因:
  1. 数据预处理方式通常对最终结果产生巨大影响
  2. 在模型训练时,参数更新变化莫测,其中的变量分布的偏移可能会阻碍网络的收敛,需要对学习率进行补偿调整
  3. 更深层的网络很复杂,容易过拟合
  • batch normalization的范围:单个可选层;所有层。
  • batch normalization原理:在每次的训练迭代中,先规范化输入:通过减去其均值并除以其标准差(均值,标准差都基于当前小批量处理),然后,应用比例系数和比例偏移(这2个基于批量统计的标准化)(这是批量规范化名称的由来)
  • 在应用batch normalization时,批量大小的选择可能没有批量规范化时更重要。
  • 批量规范化BN转换输入x的表达式,如下:

    x\epsilon\ss\ssB:x是来自一个小批量\ss的输入;\mu \hat{}_{B}:小批量B的样本均值;\sigma ^{\hat{}}_{B}是小批量B的样本标准差;
  • 应用该式子,生成的小批量的平均值为0,单位方差为1;\gamma:拉伸参数;\beta:偏移参数;\gamma\beta的形状和x相同,且是需要学习的参数
  • batch normalization常常应用到中间层,因为中间层的变化幅度不能过于剧烈,batch normalization将每层主动居中,并重新调整每一层的平均值和大小为自定的平均值和大小(通过\mu \hat{}_{B}\sigma ^{\hat{}}_{B}
  • \mu \hat{}_{B}\sigma ^{\hat{}}_{B}的计算方法如下:

其中的\epsilon>0,在这个式子中添加\epsilon的原因:确保永远不会除以0,即使在经验方差(样本方差)估计值可能消失的情况也是这样。 \mu \hat{}_{B}\sigma ^{\hat{}}_{B}通过使用平均值和方差的噪声估计抵消缩放问题(这个噪声在这个式子中的有益的)

小tips:

  • 优化中的各种噪声源通常会导致更快的训练和较少的过拟合:这种变化似乎也是一种正则化的形式。
  • batch normalization最适合50~100范围的中等批量大小的问题。
  • batch normalization在训练模式下是:通过小批量统计数据规范化,不能使用整个数据集来估计平均值和方差;在预测模式下是:通过数据集统计规范化:根据整个数据集精确计算批量规范化所需的平均值和方差。

batch normalization在深度学习中的实际使用:

训练模式:

  • 在应用batch normalization时,不能忽略批量大小(因为批量规范化在完整的小批量上运行)
  • 全连接层:将batch normalization置于全连接层中的仿射变换(对输入数据进行线性变换和偏移的操作)和激活函数之间,具体公式如下:

x:全连接层的输入;W:权重参数;b:偏置函数;BN:批量规范化的运算符;均值,方差都在该应用变换的相同小批量上计算。

  • 卷积层:在卷积层之后,非线性激活函数之间应用batch normalization:对卷积层的每个输出通道执行batch normalization,每个通道都有自己的拉伸和偏移参数(这2个参数都是标量)

预测模式:

通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。

  • 具体代码如下:

ResNet(残差网络)

引入

逼近最优解的模型的训练方向:应该是下图中的嵌套类

 最优解和架构之间的关系:

 综上可知,只有当较复杂的函数类包含较小的函数类时,我们才能确保性能是在向最优解靠近,所以在深度神经网络中,将新添加的层训练成恒等映射(identity function) f(x) = x,使得新模型同原模型一样有效,同时,新模型更可能得出更优的解来拟合数据集(故而,添加层似乎更容易降低训练误差)

正文

ResNet网络就依据上述思维构造的,核心思想是:每个附加层都应该更容易包含原始函数作为其元素之一。由此,残差块(residual blocks)诞生了。

残差块

  • 理想映射f(x)是恒等映射。
  • 经实践证明,残差映射f(x)-x在现实中更容易优化,当理想映射f(x)极接近于恒等映射,残差映射也易于捕捉恒等映射的细微波动。
  • 只需将加权运算(eg:仿射)的权重和偏置参数设成0。
  • 在残差块中,输入可通过跨层数据线路更快地向前传播。

ResNet网络思路: 

  • 沿用了VGG完整的3x3卷积层
  • 残差块:2个有相同输出通道数的3x3卷积层,每个卷积层后接一个批量规范化层,ReLU激活函数,通过跨层数据通路跳过残差块中的卷积运算,将输入直接加在最后的ReLU激活函数前,每个卷积层的输入和输出形状一样(这样才能使得它们可以相加);如果想要改变通道数,就需要引入一个额外的1x1卷积层将输入换成需要的形状后再做相加运算。
  • ResNet-18架构:

  • 具体代码如下:

 

 DenseNet(稠密连接网络)

  •  DenseNet是ResNet的逻辑扩展。=>DenseNet比ResNet更加复杂罢了。
  • ResNet仅仅需要2项,DenseNet是ResNet的扩展,输出是连接(图中[,])是展开式的映射(类想泰勒展开式)

  • 最后再将这些展开式结合到多层感知机中,再次减少特征的数量。如下图:
  • 稠密网络的构成:稠密块(dense block):定义如何连接输入和输出,过渡层(transition layer) :控制通道数量,使其不会太复杂。
  • 具体代码如下:


http://www.ppmy.cn/embedded/147117.html

相关文章

tomcat的优化和动静分离

tomcat的优化 1.tomcat的配置优化 2.操作系统的内核优化 注意:设置保存后,需要重新ssh连接才会看到配置更改的变化 vim /etc/security/limits.conf # 65535 为Linux系统最大打开文件数 * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 *…

C语言 文件操作

按格式读写文件 按格式 读文件 格式: int fscanf(FILE *stream, const char* format, [argument...]); FILE *stream 为文件指针 const char *format 为格式化字符串 [argument] 为输入列表 fscanf() 格式化输出与 scanf () 是相同的 fscanf(stdin,……) 等…

深度解析相对路径、绝对路径与URL映射策略、MVC架构

一、相对路径与绝对路径的概念与应用 路径管理是Web开发中的核心概念之一。理解不同类型的路径如何影响文件和资源的访问对于确保代码的灵活性、可维护性和可移植性至关重要。 1. 相对路径 相对路径是指相对于当前文件或目录的位置来指定目标资源的路径。它不依赖于绝对的服…

软件架构设计——通用表单UI—未来之窗行业应用跨平台架构

.东方仙盟_小世界 {margin-top: 2%;padding: 0 3%;background: #fff; } .东方仙盟_小世界 li span {width: 55px;padding-left: 0px; }.东方仙盟_小世界 li span {display: block;position: absolute;left: 0px;padding-left: 10px;width: 55px;font-size: 16px;background-siz…

centos上配置yum源

1. 进入yum源repo的目录 cd /etc/yum.repos.d/然后可以通过ls查看下面所有的后缀为.repo的文件 2. 新建一个备份目录,将原有的.repo文件放到其中 mkdir yum.repos.d.backup mv *.repo yum.repos.d.backup/3. 获取阿里提供的repo配置文件 这里使用到了wget命令&a…

渗透测试实战—利用防火墙突破网络隔离

免责声明:文章来源于真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本…

Spring Boot 3.X:Unable to connect to Redis错误记录

一.背景 最近在搭建一个新项目,本着有新用新的原则,项目选择到了jdk17SpringBoot3.4。但是在测试Redis连接的时候却遇到了以下问题: redis连不上了。于是我先去检查了配置文件的连接信息,发现没问题;再去检查配置类&am…

el-steps(vue3总)

一封装步骤条 1.1 样式 element-plus 根据原始修改样式成上述 1.2 封装 <template><div class"custom-step"><el-steps :active"currentStep" simple><template v-for"step in stepData" :key"step.id"><…