当前位置: 首页 > news >正文

深度学习基础--卷积基础模块

本节主要关注卷积神经网络发展过程中具有里程碑意义的基础模块,了解它们的原理和设计细节

1. 批归一化

在机器学习中,一般会假设模型的输入数据的分布是稳定的。如果这个假设不成立,即模型输入数据的分布发生变化,则称为协变量偏移。模型的训练集和测试集的分布不一致,或者模型在训练过程中输入数据的分布发生变化,这些都属于协变量偏移现象。

同样,对于一个复杂的机器学习系统,在训练过程中一般也会要求系统里的各个子模块的输入分布是稳定的,如果不满足,则称为内部协变量偏移。对于深度神经网络,其在训练过程中,每一层的参数都会随之更新。以第 i 层为例,其输入数据与之前所有层(第 1 层到第 i - 1 层)的网络参数取值都有很大关系;在训练过程中,如果之前层的参数被更新后,第 i 层的输入数据的分布必然也会发生变化此即为内部协变量偏移。网络越深,这种现象越明显。
内部协变量偏移会给深度神经网络的训练过程带来诸多问题:

  1. 网络每一层需要不断适应输入数据的分布的变化,这会影响学习效率,并使学习过程变得不稳定。
  2. 网络前几层参数的更新,很可能使得后几层的输入数据变得过大或者过小,从而掉进激活函数的饱和区,导致学习过程过早停止。
  3. 为了尽量降低内部协变量偏移带来的影响,网络参数的更新需要更加谨慎,在实际应用中一般会采用较小的学习率(避免参数更新过快),而这会降低收敛速度。
  4. 在之前的网络训练过程中,一般会采用非饱和型激活函数(如 ReLU)、精细的网络参数初始化、保守的学习率等方法来降低内部协变量偏移带来的影响。这些方法会使网络的学习速度太慢,并且最终效果也特别依赖于网络的初始化。

批归一化就是为了解决上述问题而提出的:它的主要作用是确保网络中的各层,即使参数发生了变化,其输入/输出数据的分布也不能产生较大变化,从而避免发生内部协变量偏移现象。采用批归一化后,深度神经网络的训练过程更加稳定,对初始值不再那么敏感,可以采用较大的学习率来加速收敛。

批归一化可以看作带参数的标准化,具体公式为
y ( k ) = γ ( k ) x ( k ) − μ ( k ) ( σ ( k ) ) 2 + ε + β ( k ) (1.1) y^{(k)}=\gamma^{(k)} \frac{x^{(k)}-\mu^{(k)}}{\sqrt{\left(\sigma^{(k)}\right)^{2}+\varepsilon}}+\beta^{(k)}\tag{1.1} y(k)=γ(k)(σ(k))2+ε x(k)μ(k)+β(k)(1.1)
其中, x ( k ) y ( k ) x^{(k)}y^{(k)} x(k)y(k)分别是原始输入数据和批归一化后的输出数据, μ ( k ) \mu^{(k)} μ(k) σ ( k ) \sigma^{(k)} σ(k)分别是输入数据的均值和标准差(在 mini-batch 上), β ( k ) \beta^{(k)} β(k) γ ( k ) \gamma^{(k)} γ(k)分别是可学习的平移参数和缩放参数,上标k表示数据的第k维(批归一化在数据各个维度上是独立进行的), ε \varepsilon ε是为防止分母为 0 的一个小量。可以看到:在批归一化过程中,设置了两个可学习的参数 β \beta β γ \gamma γ,它们有如下作用。

  • 保留网络各层在训练过程中的学习成果。如果没有 β \beta β γ \gamma γ,批归一化退化为普通的标准化,这样在训练过程中,网络各层的参数虽然在更新,但是它们的输出分布却几乎不变(始终是均值为 0、方差为 1),从而使得网络难以学习到有效的特征表示。通过引入 β \beta β γ \gamma γ,可以让网络在标准化后的数据上进行适当的平移和缩放,从而保留各层在训练过程中的学习成果。
  • 保证激活单元的非线性表达能力。上面提到,没有 β \beta β γ \gamma γ,批归一化的输出分布始终是均值为 0、标准差为 1。此时,如果激活函数采用诸如 Sigmoid、Tanh 等函数,则经过批归一化的数据基本上都落在这些激活函数的近似线性区域,没能利用上它们的非线性区域,这会极大地削弱模型的非线性特征提取能力和整体的表达能力。添加 β \beta β γ \gamma γ参数后,批归一化的数据就可以进入激活函数的非线性区域。

使批归一化模块具有自我关闭能力。若 β \beta β γ \gamma γ分别取数据的均值和标准差,则可以复原初始的输入值,即关闭批归一化模块。因此,当批归一化导致特征分布被破坏,或者使网络泛化能力减弱时,可以通过这两个参数将其关闭。

至于批归一化在网络中的位置,直觉上看无论是放在激活层之前还是之后都有一定道理。

  • 把批归一化放在激活层之前,可以有效避免批归一化破坏非线性特征的分布;另外,批归一化还可以使数据点尽量不落入激活函数的饱和区域,缓解梯度消失问题。
  • 由于现在常用的激活函数是 ReLU,它没有 Sigmoid、Tanh 函数的那些问题,因此也可以把批归一化放在激活层之后,避免数据在激活层之前被转化成相似的模式从而使得非线性特征分布趋于同化。

在具体实践中,原始论文是将批归一化放在激活层之前的,但学术界和工业界也有不少人曾表示倾向于将批归一化放在激活层之后(如论文共同作者 Christian Szegedy、Keras 作者 Francois Cholle、知名数据科学平台 Kaggle 的前首席科学家 Jeremy Howard 等人)。从近两年的论文来看,有一大部分是将批归一化放在激活层之后的,如 MobileNet v2、ShuffleNet v2、NASNet - A。批归一化究竟应该放在什么位置,仍是一个存争议的问题。

2. 全连接层

用于分类任务的卷积神经网络,其前面若干层一般是卷积层、池化层等,但网络末端一般是几层全连接层。这是因为一方面卷积层具有局部连接、权值共享的特性,其在不同位置是采用相同的卷积核进行特征提取的。也就是说,卷积层的特征提取过程是局部的(卷积核尺寸一般远小于图片尺寸),且是位置不敏感的。而且,参考文献[22]中的实验表明,即使强迫卷积层学习如何对位置信息进行编码,其效果也不理想。

因此,如果整个网络全部采用卷积层(包括池化层等),网络也许能知道图片中不同位置有哪些元素(高层语义信息),但无法提取这些元素之间的关联关系(包括空间位置上的相关性、语义信息上的相关性)。而对于分类任务,不仅需要考虑一张图像中的各个元素,还需要考虑它们之间的关联关系(全局信息)。举例来说,假设要做人脸检测任务,仅仅找出图片上的眼、鼻、口等人脸元素是不够的,它们之间的相对位置关系也非常重要(如果一张图片中人脸的各个器官被随机打乱,我们显然不会认为这还是一张人脸)。

为了提取不同元素之间的关联关系,我们需要一个全局的、位置敏感的特征提取器,而全连接层就是最方便的选择,其每个输出分量与所有的输入分量都相连,并且连接权重都是不同的。当然,卷积层也不是完全不能对位置信息进行编码,如果使用与输入特征图同样尺寸的卷积核就可以,但这实际上等价于一个全连接层(卷积的输出通道数目对应着全连接层的输出单元个数)。

从另一方面来理解,多个全连接层组合在一起就是经典的分类模型——多层感知机。我们可以把卷积神经网络中前面的卷积层看作是为多层感知机提取深层的、非线性特征。从这个角度讲,最后几层也可以接其他的分类模型,如支持向量机等,但这样就脱离了神经网络体系,处理起来不太方便,不利于模型进行端到端的训练和部署。

最近几年,分类网络在卷积层之后、最后一层之前通常采用全局平均池化,它与全连接层有着相似的效果(可以提取全局信息),并且具有如下优点。

  1. 参数量和计算量大大降低。假设输入特征图的尺寸为(w\times h),通道数为(c),则全局平均池化的参数量为零,计算量仅为(c\times w\times h);而如果选择接一个输出单元数为(k)的全连接层,则参数量和计算量均为(c\times w\times h\times k)。对于 AlexNet、VGGNet 等这种全连接层单元数动辄 1024 或 4096 的网络,全局平均池化与普通卷积层的计算量能相差千余倍。
  2. 具有较好的可解释性,比如:我们可以知道特征图上哪些点对最后的分类贡献最大。

3. 瓶颈结构

瓶颈结构是在 GoogLeNet/Inception-v1 中提出的,而后的 ResNet、MobileNet 等很多网络也采用并发展了这个结构。瓶颈结构的初衷是为了降低大卷积层的计算量,即在计算比较大的卷积层之前,先用一个 1×1 卷积来压缩大卷积层输入特征图的通道数目,以减小计算量;在大卷积层完成计算之后,根据实际需要,有时候会再次使用一个 1×1 卷积来将大卷积层输出特征图的通道数目复原。由此,瓶颈结构一般是一个小通道数的 1×1 卷积层,接一个较大卷积层,后面可能还会再跟一个大通道数的 1×1 卷积层(可选)。
在这里插入图片描述

瓶颈结构是卷积神经网络中比较基础的模块,它可以用更小的计算代价达到与之前相似甚至更好的效果(因为瓶颈结构会增加网络层数,所以特征提取能力可能也会有相应提升)。瓶颈结构基本上可以用于所有的卷积神经网络中,场景包括物体检测和分割、生成式对抗网络等大方向,以及诸如人脸匹配、再识别、关键点检测等细分领域。

沙漏结构也是卷积神经网络中比较基础的模块,它类似于瓶颈结构,但尺度要更大,涉及的层也更多。沙漏结构一般包括以下两个分支。

  1. 自底向上(bottom-up)分支:利用卷积、池化等操作将特征图的尺寸逐层压缩(通道数可能增加),类似于自编码器中的编码器(encoder)。
  2. 自顶向下(top-down)分支:利用反卷积或插值等上采样操作将特征图的尺寸逐层扩大(通道数可能降低),类似于自编码器中的解码器(decoder)。
    在这里插入图片描述

参考文献[24]用一个具有沙漏结构的网络来解决人体姿态估计任务,其基本单元如图 1.19 所示;整个网络则由多个沙漏结构堆叠而成,如图 1.20 所示。此外,在物体检测任务中,沙漏结构也有着大量应用,如 TDM(Top-Down Modulation)、FPN(Feature Pyramid Network)、RON(Reverse connection with Objectness prior Networks)、DSSD(Deconvolutional Single-Shot Detector)、RefineDet 等模型,它们的网络结构如图 1.21 所示。图中的 RFB(Reverse Fusion Block)是将上采样后的深层特征和浅层特征进行融合的模块。在这些应用中,沙漏结构的作用一般是将多尺度信息进行融合;同时,沙漏结构单元中堆叠的多个卷积层可以提升感受野,增强模型对小尺寸但又依赖上下文的物体(如人体关节点)的感知能力。
在这里插入图片描述
在这里插入图片描述

相关文章:

深度学习基础--卷积基础模块

本节主要关注卷积神经网络发展过程中具有里程碑意义的基础模块,了解它们的原理和设计细节 1. 批归一化 在机器学习中,一般会假设模型的输入数据的分布是稳定的。如果这个假设不成立,即模型输入数据的分布发生变化,则称为协变量偏…...

视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍

随着智能手机的普及,手机已成为人们生活中不可或缺的一部分。然而,在某些场合,如驾驶、会议、学校课堂等,不当使用手机可能会导致安全隐患或干扰他人。因此,开发出一种能够准确识别并阻止不当使用手机的行为检测算法显…...

6.2图的存储及基本操作

6.2.1顺序存储 邻接矩阵法,用一个一维数组存储图中顶点信息,二维数组存储图中边的信息 无向图 1.无向图的邻接矩阵关于对角线对称,可采用压缩存储 2.边数为e,则邻接矩阵中1为2e; 3.第i行or 第i列非零元素之和恰好为顶点i的度数 4.判断是否有边用0,1 5. 有向图 1.关于对…...

Java语法全解析:掌握基本规则,打造稳固编程基础!

Java基本语法是编写Java程序的核心,它包括了数据类型、运算符、控制结构、类与对象等基本组成部分。这些语法要素共同构成了Java程序的基础框架,掌握它们是进行Java编程的前提。以下是Java基本语法的详细介绍: 数据类型 基本数据类型&#x…...

同时播放多个视频

介绍一款小众的视频播放器,之前有小伙伴找那种可以同时播放多个视频的软件,“恒硕加播放”可以做到这一点,功能不是太多,但是日常播放是足够了。 同时播放多个视频控制多个视频跳到指定进度同时暂停/播放/停止/静音/倍速浏览系统…...

伴奏提取消除人声如何操作?轻松几步玩转音乐世界

你是否梦想着独自演绎一曲,或是进行个性化的混音创作,却又希望摆脱原唱声音的干扰?那么,学会免费伴奏提取就显得尤为关键。 在这篇文章中,我将为你展示四种简单易学的方法,让你能够轻松地从歌曲中提取出伴…...

uniapp二维码生成

uniapp二维码生成 参考文档依赖引入代码html部分生成代码&#xff08;vue3 hook&#xff09;使用 参考文档 【博主&#xff1a;ChoneyLove】uniapp中生成二维码及解决微信小程序端问题总结 依赖引入 npm i uqrcodejs代码 html部分 <canvas type"2d" id"…...

Android UID 和 userID 以及 appID

我们知道Android 操作系统是基于Linux内核的&#xff0c;所以Android 的UID 是基于 Linux UID的。 Linux UID Linux 本身就是一个多用户操作系统&#xff0c;每一个用户都会有一个UID&#xff0c;不同UID 之间的资源访问是受限的。 其中&#xff0c;Linux的DAC权限模型&#…...

Kafka的三高设计原理

1.生产者缓存机制--高性能 生产者缓存机制的主要目的是将消息打包&#xff0c;减少网络IO频率 kafka生产者端存在消息累加器RecordAccumulator&#xff0c;它会对每个Partition维护一个双端队列&#xff0c;队列中消息到达一定数量后 或者 到达一定时间后&#xff0c;通过sen…...

生信圆桌x生信宝库:生物信息学资源与工具的终极指南

介绍 生物信息学作为现代生物科学的重要分支&#xff0c;涉及到大量的数据处理、分析和存储工作。随着领域的不断发展&#xff0c;各类生物信息学资源与工具也如雨后春笋般涌现。这些资源涵盖了从基因组数据、蛋白质结构到代谢路径的方方面面&#xff0c;极大地丰富了科研人员的…...

centos7 install rocketmq 宿主机快速搭建RocketMQ单机开发环境_centos7 单机部署rocketmq命令

2214 Jps 2071 BrokerStartup 1947 NamesrvStartup ### 第四步&#xff1a;发送消息测试消费着启动export NAMESRV_ADDRlocalhost:9876 ./tools.sh org.apache.rocketmq.example.quickstart.Consumer 发送测试消息export NAMESRV_ADDRlocalhost:9876 ./tools.sh org.apache.roc…...

2024高教社杯全国大学生数学建模竞赛(A题)深度剖析 _ 建模完整过程+详细思路+代码全解析

问题1解答过程 1.1 螺线运动的基本几何模型 板凳龙的舞动路径为等距螺线。螺线是极坐标中一类常见曲线&#xff0c;其特点是半径随角度线性增加。我们可以用以下极坐标方程描述这条螺线&#xff1a; r ( θ ) p 2 π θ r(\theta) \frac{p}{2\pi} \theta r(θ)2πp​θ 其…...

What is Approximation Ratio?

Approximation Ratio 近似比率是用来衡量一个算法找到的近似解与最优解之间的差距的一个量化指标. 假设有一个优化问题&#xff0c;其最优解的值是OPT&#xff0c;用时间T&#xff0c;而我们的算法得到的解的值是ALG,用时间t。如果算法有一个2的近似比率&#xff0c;那么我们…...

探索Unity与C#的无限潜能:从新手到高手的编程之旅

在数字创意与技术创新交织的今天&#xff0c;Unity游戏引擎凭借其强大的跨平台能力和灵活的编程接口&#xff0c;成为了无数开发者心中的首选。而C#&#xff0c;作为Unity的官方脚本语言&#xff0c;更是以其面向对象的特性和丰富的库支持&#xff0c;为游戏开发注入了无限可能…...

初始MYSQL数据库(2)——创建、查询、更新、删除数据表的相关操作

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 前面我们学习了创建、删除数据库以及创建、查看、删除数据表的相关操作。 我们知道数据库中所存储的数据其实就是数据表中一条一条的记…...

OpenCV直方图计算

#include <opencv2/opencv.hpp> #include <vector>using namespace cv; using namespace std;int main() {cout << "直方图calcHist" << endl;Mat src imread("left.png", IMREAD_GRAYSCALE);if (src.empty()){cout << &qu…...

多线程篇(并发相关类- 原子操作类)(持续更新迭代)

目录 前言 一、原子变量操作类&#xff08;AtomicLong为例&#xff09; 1. 前言 2. 实例 二、JDK 8新增的原子操作类LongAdder 三、LongAccumulator类原理探究 前言 JUC包提供了一系列的原子性操作类&#xff0c;这些类都是使用非阻塞算法CAS实现的&#xff0c;相比使用…...

数学建模常用工具总结

数学建模常用工具总结 绘图篇pythonMATLABLIVEGAP CHARTSApache EChartsBioLadderHiplot Pro 生物医学可视化平台Graph EditorRAWGraphs 2.0ExcalidrawPPT绘图 配色篇Color SpaceAdobe Color 素材篇手绘素材插画网iconfont-阿里巴巴矢量图标库下面四个都是实物风格的素材&#…...

【Redis】为什么选择 Redis 做缓存?

近期文章&#xff1a; 【Redis】Redis 底层的数据结构&#xff08;结合源码&#xff09; 【MySQL】索引底层的数据结构 BTree 在系统开发中&#xff0c;我们经常会使用 Redis 作为缓存系统&#xff0c;但你知道为什么要使用缓存吗&#xff1f;为什么是使用 Redis 作为缓存呢&…...

Flutter 开发常用第三方库总结

Flutter 开发常用第三方库总结 常用库 常用库 屏幕适配flutter_screenutil加载 svg flutter_svg状态管理 flutter_bloc&#xff08;bloc、equatable&#xff09;、provider视频播放器chewie图片缓存cached_network_image网络请求 dio设备信息查询device_info_plus文件路径 pat…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...