卷积神经网络
前言
卷积神经网络时一种在计算机视觉领域的深度学习的模型,它的设计主要来自于生物学中的视觉系统,旨在模拟人类视觉处理的方式。卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络是多层感知机的变种。

基本概念
不变性
不变性意味着即时目标的外观发生了某种变化,但是依然可以识别出来。不变性在图像识别中是一种很好的特性,都希望图像中的目标无论是被平移、旋转还是缩放,甚至是不同的光照条件、视角下都能被很好的识别出来。
- 平移不变性:识别物体的能力不因物体在图像中的位置变化而改变。
- 在卷积层中,使用相同的卷积核在图像中滑动,无论特征出现在哪里都会被识别到
- 在池化层中,对局部区域进行下采样,即使特征有微小偏移,池化后也能得到相同输出
- 旋转不变性:识别物体的能力不因物体的旋转角度而改变
- 在训练时随机旋转图像
- 旋转等变卷积
- 尺度不变性:识别物体的能力不因物体在图像中的大小变化而改变
- 将输入图像缩放成不同的尺寸,然后分别送入网络检测,最后合并结果
- 在训练时随机缩放图像,迫使网络学习不同尺度下识别物体
- 光照不变性:识别物体能力不因光照条件而改变
- 将像素值规整到统一的分布
- 随机调整图像的亮度、对比度和饱和度进行训练
- 使用对光照不敏感的特征
感受野
感受野就是在卷积神经网络中,某一层的特征图熵的一个像素点对应在原始输入图像中的大小。实际上就是网络中的一个点对应着输入图像的多大范围。在浅层神经元中的感受野很小,它所关注的就是局部细节特征,而深层神经元中的感受野就很大,它能够整合多个局部特征,形成全局抽象的特征。
卷积层感受野计算公式
其中公式 1 就是从输入层推算到输出层的,公式 2 是从输出层到输入层。
- 为当前层的感受野
- 是下一层的感受野
- 是上一层的感受野
- 是当前层的步长
- 是卷积计算的卷积核尺寸,是卷积核的有效核的大小,例如对于 的卷积核,它的
经过计算发现,两个 的卷积核堆叠,其等效的感受野相当于一个 的卷积层,而三个 的卷积核堆叠,就等效为一个 的卷积。但是它们之间还是有区别的
- 两个 的卷积核的参数总量 比 的卷积的参数 少
- 堆叠的小卷积之间插入了更多的激活函数,使得模型判别能力更强
- 最终得到的感受野与大卷积核相同
扩大感受野的方式
- 堆叠卷积层
- 池化层
- 带步长卷积
- 空洞卷积
分辨率
在卷积计算中,从输入的 的尺寸到最终的卷积输出的 的尺寸,整个过程是一个信息逐步抽象化的过程,也就是网络学习到的信息逐渐由低级的几何信息转变为高级的语义信息,最终输出的图像大小对后续的处理计算也有很大影响。如果输出的尺寸太大会导致信息抽象层次不够高,影响网络的性能,而输出的尺寸太小,会造成很严重的信息丢失,导致训练无法收敛。
网络宽度
网络宽度决定了网络在某一层中学到的信息量,但网络的宽度指的是卷积神经网络中最大的通道数,由卷积核数量最多的层来决定。通常的结构设计中卷积核的数量随着层数越来越多的,直到最后一层数量到最大,这是由于约到最深层,特征图的分辨率越小,所包含的信息就越高级,所以需要更多的卷积核来进行学习。通道越多效果越好,但是对应的计算量也会大大增加。实际上就是每一层里所包含的神经元数量,神经元数量越多,并行处理能力和学习复杂模式的能力就越强。
优点
- 网络宽度带来强大的模式拟合能力,更宽的层可以学习到输入数据中更丰富的特征,能同时处理信息的多方面
- 只要单隐藏层的神经网络有足够多的神经元,它就可以以任意精度近似任何连续函数,所以宽度也是有强大的表达能力的
- 在宽网络中,计算反向传递时,每个神经元计算梯度时有更多的路径回流,这就可以缓解梯度消失问题
缺点
- 增加网络宽度导致参数数量的平方级增长,这就会导致模型体积过大,计算或存储成本高
- 过多的参数导致过拟合
- 对于某些复杂的函数,一个浅而宽的网络可能需要指数级于深网络的神经元数量才能得到相同的能力
网络深度
神经网络的深度决定了网络的表达能力,一般神经网络的深度指的是神经网络的层数,信息从输入层传递到输出层的过程中,每一层都对信息进行一些处理并且传递给下一层。
优点
- 浅层网络学习的是简单、局部的特征;深层网络可以逐层组合这些简单的特征,形成更复杂、更全局的特征。
- 理论上,一个深而窄的网络可以用比浅而宽的网络更少的参数来表达同样复杂的函数。深度通过组合简单的函数来构建复杂函数,它的参数利用效率更高。
缺点
- 在反向传递时,梯度需要从输出层逐层传递回输入层,当网络过深时,梯度可能回因为链式法则的连续相乘而变得极小或者极大,导致早期层的权重无法有效更新
- 层数越多导致模型过于复杂,导致模型记住了训练数据中的噪声和细节,导致测试表现不佳
- 层数越多,前向传递和反向传递的计算量就越大
下采样
下采样就是降低数据在空间或时间维度上的分辨率,同时增加数据的特征深度,它是一种汇聚或者压缩信息的过程。它直接关系到网络的效率、性能等信息。
主要目的
- 减少计算量和内存消耗:特征图的宽度和高度减小之后,后续层需要处理的元素数量就会较少很多,降低了对计算复杂度和对显存的需求
- 扩大感受野:感受野就是卷积层中一个像素点对应原始输入图像的区域的大小。通过下采样,后续卷积层中的一个很小的核就能对应到原始输入图像中一个更大的区域,这就能使整个网络看到更全面抽象的信息
- 防止过拟合:下采样通过减少参数的数量和引入一定的平移不变性,有助于防止模型过拟合
下采样的实现方式
- 池化层:主要目的就是对特征图进行压缩,降低数据量,保留最重要的信息
- 卷积:卷积核在特征图上移动时不是逐点滑动,而是跳跃滑动
卷积
在图像识别中,希望不论一个物体在画面的左侧还是右侧,都会被识别为同一物体,而卷积操作可以捕捉到图像中的局部特征而不受其位置的影响。
卷积操作就是指将一个可移动的小窗口与图像进行逐个元素相乘然后相加的操作,这个小窗口就是一组固定的权重值,被称为卷积核。
卷积核需要注意的参数
- 卷积核步长:就是每次滑动的位置距离,卷积核每次移动的像素数,步长越大输出的图像就越小。
- 卷积核个数:决定输出图像的深度。一个卷积层通常有多个滤波器,每个滤波器都会生成一个独立的特征图。这些特征图堆叠在一起,构成了输出的三维数据体。输出的深度取决于卷积核的数量。
- 填充值:在外围边缘补充若干圈 0,便于从初始位置以步长为单位可以刚好滑到末尾位置

下池化
下池化并不是一个标准的属于,一般说的池化都是下池化,核心目的就是下采样。下池化就是通过池化操作来减小特征图的空间尺寸,作用就是压缩信息、扩大感受野和提高计算效率,并且引入一定的平移不变性。
在下池化中,通常用 最大池化,一个 的窗口在输入特征图上滑动,每次都移动两个像素,因此窗口之间没有重叠,在窗口每次滑动时,取所有像素值的最大值作为输出,最终计算的结果由于步幅与窗口大小相同,输出特征图的宽度和高度将减半。

上采样
上采样也称为上池化或者插值,是指增加数据在空间或时间维度上的分辨率,是一种恢复或扩展信息的过程。上采样就是将下采样过程之后的数据重建,相当于是一种恢复或扩展信息的过程。上采样主要用于需要输出与输入尺寸相同或生成较高分辨率输出的任务中
- 图像语义分割中,对输入图像的每一个像素分类,网络通过下采样提取高级特征之后,需要通过上采样路径将特征图恢复到原始图像的尺寸,生成像素级的预测图
- 将一张低分辨率的图片重建为高分辨率的图片的过程就是上采样
- 在目标检测中为了精确检测不同尺度的物体,需要融合来自不同层的特征图,这就经常将深层或低分辨率的特征图上采样,以便于与浅层或高分辨率的特征图融合
实现上采样的方法
- 反卷积:是最常用的且功能最强大的上采样方法,它其中也包含可学习的参数。在输入特征图的每个元素之间插入 0,这些由上一步的步长参数决定,步长参数为 2 时,就在每个元素之间插入 1 个 0。之后再用一个卷积核在跳虫后的图上进行步长为 1 的普通卷积。
- 反卷积的参数是可以学习的,网络能学习如何最好的从低分辨率特征途中重建高分辨率的细节
- 但是如果零填充和卷积核大小不匹配可能导致不均匀的重叠
- 上池化:创建一个空的更大的输出图,然后从编码器路径读取保存的最大值的位置索引,将当前层的数据放置到对应的索引指定的位置上,其他位置填 0,在还原特征值方面很精确,但是会产生稀疏的特征图。
- 最近邻插值和双线性插值,这都是无需学习参数的图像缩放的方法,直接被用于神经网络中
- 最近邻插值:输出像素的值直接取自输入中最近的像素值,计算速度快,但是生成结果粗糙,可能有明显的马赛克效应
- 双线性插值:输出像素的值由输入中最近的 邻域的四个像素进行线性插值计算得到的,并且考虑了四个像素的距离权重,它的结果相较于最近邻插值更加平滑,但是可能无法恢复高频细节。
反卷积
反卷积(转置卷积)并不是卷积逆运算,是一种上采样的方法,目标是将一个小尺寸的特征图,通过一个类似于卷积的过程,扩展为一个更大尺寸的特征图。它的输入是低分辨率高维度的特征图,输出为高分辨率低维度的特征图。它是一种前向传播的过程,效果与卷积相反,它通过学习到的特征来填充像素之间的空隙。
转置卷积在输入特征图的元素之间插入 0,插入 0 的数量由上一卷积层的步长-1 决定的,填充之后,为了控制输出的尺寸,也会在填充之后的数据周围补零。之后在填充后的特征图上,使用一个卷积核进行步长为 1 的普通卷积。反卷积所用的卷积核的选择与它对应的卷积操作的卷积核之间有一定的关系,在数学概念上是互逆的,在训练之初是可以使用原核的翻转来初始化卷积核的,但是到实际的训练中,它们两个是互相独立的、可学习的参数集。下面这个使用的卷积核就是对应原核扩大了 3 倍的逆,效果并不是特别明显,因为这个卷积核并没有经过训练

相对于简单的插值的方法,它需要额外的计算量。主要用于对特征图进行上采样,得到与原始图像对齐的、更精确的检测框。
上池化
上池化是上采样的一种实现方式,可以看作是池化的逆操作,它的设计初衷就是为了恢复特征图尺寸的同时,尽可能保留和还原在池化层过程中丢失的位置信息。它利用了在下采样阶段中记录的位置信息。例如最大池化中,将一个区域池化为一个值时,不仅仅记录这个最大值,也记录最大值在这个窗口中的位置,而在上池化需要放大特征图时,就利用这些保存的位置索引,将值放回它原来的位置

优点
- 它能将强特征信号还原到其原始的空间位置上
- 和池化操作一样,是一个固定操作,不需要学习任何权重,计算开销小
缺点
- 最终输出的特征图中大部分位置都是 0,这些零值不包含任何信息,需要后续的卷积层来学习和填充这些空洞以恢复更平滑完整的特征
- 它还原的信息不完整,完全丢弃了池化窗口中的其他信息
- 它必须与编码器路径中对应的池化层紧密耦合,需要保存和传递索引信息,增加了内存开销和架构的复杂性
NAS
NAS 是宏观架构搜索,从零开始或者在大框架之下自动设计网络整体结构。NAS 的核心思想就是用算法自动搜索出在特定任务和数据集上性能最优的神经网络结构,从而代替人工设计。工作流程如下
- 预先定义好基本的组件和组合的规则
- 使用一个控制器来设计一个网络的结构
- 在目标数据集上训练这个设计的网络结构,得到其准确率、速度等指标
- 将性能指标作为奖励,反馈给控制器,指导其生成更好的结构
- 最终输出在验证集上性能最佳的架构
NetAdapt
NetAdapt 是一种自动化、迭代式的网络剪枝的方法,从一个预训练好的高性能网络出发,在满足硬性的资源约束的前提下,通过多次调节和验证的微调步骤,自动移除网络中冗余的网络层。工作流程如下
- 预先训练好的种子网络,设定需要实现的目标
- 在当前网络的基础上,生成一系列的网络裁剪的分支,每个分支都会少量移除一些层。之后不进行完整的重新训练,而是使用一个短期的微调来快速评估每个提议的精度的损失,选出损失最小的分支。采取这个最佳的分支,并且对新的网络进行完整的微调,恢复其精度。
- 重复迭代计算,直到满足需求
卷积神经网络的结构
一个卷积神经网络结构可以看作是由多种不同功能层堆叠而成的特征提取器和分类器的结合。核心的设计思想就是:前面的层提取局部和底层的特征,后面的层逐步组合这些特征,形成更加复杂全局的特征。
输入层
输入层是网络的起点,负责接收和准备原始的图像数据,数据的格式就是图像的格式,数据格式通常是三维的,例如 [height,width,channel] ,对于彩色图像通道数就是 3,对于灰度图像,通道数就是 1。
在 CNN 中,输入的数据通常是一个 4 维度的张量,在 pytorch 中格式为 [Batch_size, Channels, Height, Width] ,其中 Batch_size 为批大小,就是一次性输入到网络中进行处理的样本数量, Channels 是通道数,表示输入数据的特征维度数,对于图像数据来说,它就是颜色通道。高度和宽度就是图像的空间分辨率。
输入层的数据通常进行预处理,预处理对模型的收敛速度和性能至关重要。
- 归一化:将像素值从 缩放到 之间,或者进行标准化,这就能加速模型收敛,提高训练的稳定性,能更容易找到最优解
- 数据增强:通过对输入图像进行随机的旋转、反转、裁剪、变色等,在输入层之前增加数据的多样性,防止过拟合
卷积层
卷积层是卷积神经网络的核心,卷积层就是使用卷积核在输入数据上滑动,通过卷积运算提取局部特征。每个卷积核就是专门用于提取一中特定的特征的。卷积核在输入滑动计算之后产生的二维激活图,其中数值比较大的区域就表示该处检测到了卷积核所代表的特征。之后通过应用激活函数来引入非线性,使网络能进一步学习复杂的特征。
卷积层的卷积核是一个小的二维的权重矩阵,但是对于多通道的图片来说,它的卷积核就也是多通道的,有与图片一样的深度,负责在输入数据中提取一种特定的局部特征,它在输入图像上滑动,在每个位置与对应的局部区域进行点积运算,计算出一个数值,表示该位置匹配该特征的程度。
卷积层的输出特征图的尺寸,由输入尺寸 、卷积核的数量 、卷积核的大小 、步长 和填充 来决定。一般来说输出尺寸公式如下所示
卷积层的输出是一个三维张量。浅层卷积层负责学习提取一些低级、通用的视觉特征,例如边缘、角点等,这些特征对大多是图像任务都有用。中层卷积层负责组合低级特征,形成更复杂的模式。深层卷积层用于组合中层特征,学习高度抽象和任务相关的特征。

激活层
激活层就是激活函数曾,通常位于卷积层或全连接层之后,主要作用就是音符非线性。激活层中没有需要学习的参数,对输入张量的每一个元素独立地进行相同的非线性函数计算。利用上一层元素的加权输出作为输入,对齐进行激活函数运算得到激活层输出。
- 激活层引入了非线性
- 激活层决定了神经元是否被激活,根据输入的信号决定神经元的输出强度
- 不同的激活函数有不同的梯度特性,直接影响反向传播的效率和学习动态
- 通过多层非线性变换,网络从低级特征逐渐组合得到高级特征
池化层
池化层是 CNN 中一个非常重要的部分,对特征图进行下采样,进一步减少数据量、参数和计算量,同时增强模型的平移不变性和防止过拟合。池化层通过减小特征图的大小来减少计算复杂性,通过选择池化窗口内的最大值或者平均值来实现。它通常被插入在连续的卷积层之间,通过下采样压缩特征图的空间尺寸,同时保留最显著的信息。
池化层主要目的
- 降低计算复杂度
- 防止过拟合
- 保持平移、旋转等不变性
- 扩大感受野
池化层工作方式与卷积层很类似,也是一个窗口在特征图上滑动,但是关键区别在于,池化层没有需要学习的参数,它的过程是确定性的。主要类型有
- 最大池化:在滑动窗口覆盖的区域内,取最大值作为输出
- 平均池化:在滑动窗口覆盖的区域内,取平均值作为输出
- 全局平均池化:对特征图的每一个通道,计算其所有像素的平均值,对于一个 的特征图,相当于是压缩成了 的向量。通常用于替换传统的全连接层,作为网络最后一层直接输出给分类器。它能极大减少参数,防止过拟合,并且使网络对输入图像的空间位置不那么敏感。
全连接层
在网络的末端,通常会连接一个或者多个全连接层,它负责完成从提取的特征任务到最终的任务。将卷积层和池化层提取到的分布式特征综合起来,用于最终的分类或者回归输出。实际上就是把三维的特侦图展开成一维向量,然后像传统神经网络一样进行连接。
全连接层中,每一个神经元都与前一层的每一个神经元相连,而卷积层相当于是局部连接。将输入送入全连接层时通常会将特征图展开成一个一维的向量,这个过程完全抛弃了特征的空间位置信息。它的计算过程与传统神经网络中的层完全相同,加权求解和激活函数。在经典的 CNN 架构中,全连接层通常出现在网络的最后几层。
全连接层由于每个神经元都连接到所有的输入特征,有能力学习特征之间复杂的、非线性的组合关系,从而做出高度非线性的决策。但是全连接层参数量巨大,而且失去了图像的空间信息,另外参数量巨大导致模型很容易记住训练数据,而不是学习泛化的规律,从而导致过拟合,所以通常配合 Dropout 等强正则化方法使用。
由于全连接层的那些缺点,全连接层有了几个替代方案
- 全局平均池化:使用全局平均池化取代末尾所有的全连接层,直接对最后一个卷积层输出的每个特征图求平均值,将这个平均值作为该类别的置信度,直接送入
softmax函数中。这能减少参数量,有效防止过拟合,保留了特征图的空间一致性,对输入的空间变换更友好 - 全卷积网络:彻底移除全连接层,网络全由卷积层组成
注意力模块
SE 模块
注意力模块时 2017 年提出的通道注意力机制,主要作用就是让网络自动给重要的通道更高的权重,抑制不重要的通道。注意力模块就做了两件事情
- Squeeze:压缩,提取全局通道的特征,把每个通道的空间信息压成一个数字
- Excitation:激发,通过两层全连接生成每个通道的权重,再利用 sigmoid 进行归一化,最后与原特征的通道逐个相乘
注意力模块的结构如下
- 全局均值池化层
- 全连接层 1,进行降维操作,将原有通道降维原来的 倍,这里的 是降维的比例,之后连接 ReLU 激活函数,这里可以选择使用逐点卷积来降维
- 全连接层 2,将降维之后的特征图重新升维到原有的通道,后续连接 Sigmoid 激活函数进行归一化之后得到通道权重,这里可以选择使用逐点卷积来降维
- 之后将输入通道与对应的通道权重相乘
注意力模块几乎不增加计算量,却能够极大的提升精度
CBAM 模块
CBAM 模块是一个卷积块注意力模块,是一种轻量级的注意力模块,可以无缝地集成到任何卷积神经网络架构中,通过强调重要的特征通道和空间位置来提升模型的性能。
核心思想就是:在通道和空间两个独立的维度上,依次应用注意力机制。所以它是由两个子模块串联而成的
- 通道注意力模块:学习不同通道之间的注意力
- 输入特征图,维度为
- 压缩空间信息,对每个通道都做全局平均池化和全局最大池化,将特征图缩成一个单一的数值,输出为
- 共享的全连接层,将上述两个池化的结果分别送入一个共享的多层感知机,这个结构如下
- 全连接层 1,进行降维操作,将原有通道降维原来的 倍,这里的 是降维的比例,之后连接 ReLU 激活函数,这里可以选择使用逐点卷积来降维
- 全连接层 2,将降维之后的特征图重新升维到原有的通道,这个不连接激活函数
- 将两个池化经过多层感知机之后的结果合并起来,再通过 Sigmoid 激活函数得到每个通道的权重
- 最后将得到的通道注意力的向量与原始输入的特征图逐通道相乘,得到精炼之后的特征图
- 空间注意力模块:这个模块的目标是学习特征途中不同空间位置的重要性
- 输入经过通道注意力模块甲醛之后的特征图 ,维度为
- 压缩通道信息,沿着通道的维度,分别进行平均池化和最大池化,生成两个 的特征图
- 将这两个特征图在通道维度上拼接起来,得到 的特征图
- 使用一个标准的 卷积层对拼接之后的特征图进行卷积操作,将通道数降低,然后通过一个 Sigmoid 函数得到每个空间位置的权重
- 将得到的空间注意力矩阵与输入特征图 按空间位置相乘,得到最终的输出特征图
CBAM 注意力模块的计算量和参数非常少,但是能带来显著的性能提升,能比较容易地集成到现有的 CNN 中。而且他同时考虑了通道和空间两个维度上的信息,比只使用单一注意力更有效。在每个注意力模块中同时使用了平均池化和最大池化,能捕捉更丰富的特征统计信息。
CA 模块
CA 全称为 Coordinate Attention,是一种集成了位置信息的轻量级高效注意力机制,它旨在克服通道注意力和空间注意力的局限性。CA 的核心思想就是将位置信息嵌入到通道注意力中,让网络同时关注通道注意力和空间注意力。CA 的结构如下

- 输入特征图,尺寸为
- 对每个通道不使用全局平均池化,而是分别使用两种池化方法
- 水平全局平均池化,使用池化核尺寸 对每个水平行进行池化,输出尺寸为
- 垂直全局平均池化,使用池化核尺寸 对每个垂直列进行池化,输出尺寸为
- 将两个方向上的特征图进行拼接,之后送入一个共享的逐点卷积,后接一个批量归一化函数和激活函数,输出特征图为 ,输出特征图的尺寸为
- 将特征图 沿着空间维度分解为两个独立的张量,尺寸分别为 和
- 分别用两个逐点卷积将通道数量转为 ,并且利用 Sigmoid 激活函数得到注意力权重,最终将得到的水平注意力权重与垂直注意力权重与原始的输入特征图进行相乘得到最终的输出
CA 注意力模块通过单反向的池化操作,可以有效捕获沿着水平或垂直方向的长距离依赖,与将空间信息压缩为一个点的通道注意力不同,CA 将位置信息分解到两个方向上,从而能够更精确地定位感兴趣的区域。而且 CA 模块只引入极少的计算开销,可以方便地嵌入到各种网络架构中
ECA 模块
ECA 全称为 Efficient Channel Attention,是一种轻量级且高效的通道注意力模块,是对 SE 注意力模块地通道注意力机制的改进。ECA 的核心思想就是:在保持通道注意力有效性的同时,极大地降低其复杂性和参数数量,也避免降维带来的副作用。ECA 相较于 SE 来说,移除了全连接层,不使用降维,使用一维卷积,这个一维卷积的作用就是捕获相邻通道之间的局部交互,每个输出通道的权重是由其自身和相邻的几个通道共同决定的。ECA 的结构如下
- 输入特征图
- 全局平均池化,输出向量
- 一维卷积操作,卷积核的大小并不是固定值,ECA 提供了一个经验性的自适应函数,使得卷积核大小与通道数相关 ,通常会设置 ,其中 表示取最接近的奇数
- Sigmoid 激活函数,得到通道注意力向量
- 最后将得到的通道注意力的向量与原始输入的特征图逐通道相乘,得到精炼之后的特征图
ECA 的参数数量极少,直接基于原始的通道进行权重预测,避免了降维对通道注意力预测的负面影响,提高了数据的有效性。另外ECA 的自适应卷积核的大小确保了对于不同深度的网络,注意力覆盖的范围都能保持适当的比例
需要注意的是 ECA 的卷积操作的对象是通道层,所以在卷积操作之前需要将特征图旋转一下,使得通道层作为卷积操作的对象,以此实现相邻通道权重的融合。
卷积结构
标准卷积
标准卷积就是最常见的结构,计算规则如上述的卷积和卷积层所介绍的一致,这里不再赘述。

深度卷积
深度卷积是标准卷积的一种变体,也是深度可分离卷积的关键组成部分。深度卷积将空间卷积和通道融合两个步骤分离,只负责空间卷积,一个通道对应一个卷积核,每个输入通道都独立地被一个二维卷积核进行过滤,并且输入通道和输出通道一一对应。
例如输入信息尺寸 ,卷积核的形状为 ,可以看作是 个独立的卷积核,第一个卷积核在第一个通道上滑动,得到一个二维图,第二个卷积核在第二个通道上滑动,以此类推,最终得到 个二维特征图,将这些特征图堆叠起来,最终得到输出为

优点:计算效率高,相较于标准卷积来说,需要的参数数量少,需要的计算成本也低
缺点:主要就是各个通道之间是独立计算的,也就是它不能融合不同通道的特征信息来生成新的更有意义的空间信息。
所以通常深度卷积很少被单独使用,一般会与一个 1x1 卷积结合,组成深度可分离卷积。其中的深度卷积负责空间卷积,高效的提取空间特征,而 1x1 卷积负责通道融合,构建新的特征。它们这个组合的参数量仍远小于标准卷积的参数量。
分组卷积
分组卷积通过改变连接模式来显著降低计算复杂度和参数量的卷积方法。它主要就是将输入和输出通道分组,只在组内进行卷积运算,组与组之间没有连接。
例如输入信息尺寸 ,设定组数为 ,将输入通道平均分割成 个组,同样也将输出通道 平均分割为 个组。卷积运算被限制在每个组内独立进行,第一组的输入只与第一组的输出相连,以此类推。每个组中都有一个独立地小型的标准卷积在并行处理,这些卷积的卷积核尺寸为 ,之后再将每个组的输出在通道维度上拼接起来,形成 的尺寸。

相较于标准卷积,分组卷积的计算效率提升巨大,它可以实现多个卷积核并行计算,减少计算时间,另外它所涉及的计算量只有标准卷积的计算量的 ,所以它是一种非常直接有效的模型加速和压缩的方法。当分组数量足够多,以至于每个组内只有一个通道时,这时候就转变成了深度卷积。
优点:计算效率高,分组卷积强制学习到多种不同的特征表示,这有时能提高模型的容量和泛化能力,而且各组之间的计算是独立的,非常适合在多个GPU上进行模型并行训练。
缺点:通道被分成组后,组与组之间在卷积阶段没有信息交流。这可能会限制特征的充分融合,从而影响模型的表征能力。而在 ShuffleNet 中,为了解决组间信息隔离问题,在分组卷积之后将不同组的特征信息进行重新排列和混合,让下一层卷积的输入能够接收到来自不同组的信息,减少通道间信息的隔离。
空洞卷积
空洞卷积是一种很巧妙的卷积技术,在不增加参数数量且不损失分辨率的前提下,能极大的扩大感受野,从而获得更广泛的上下文信息。核心思想就是带间隔的采样,在标准的卷积核的权重元素之间注入空洞,使得卷积核在覆盖输入时跳过一些像素。
空洞卷积中,首先需要设定膨胀率,也就是定义了卷积核处理数据时权重值之间的间距,膨胀率就是指核元素之间间隔的像素数,膨胀率默认为 1,核元素之间没有间隔。对于一个固定大小的卷积核,在膨胀率为 的时候,它的有效的感受野尺寸会增大。计算可以得到有效的卷积核尺寸 ,所以可以得到,对于 的卷积核,膨胀率为 2 时,计算之后的有效卷积核尺寸为 5,这就意味着它和 的卷积核有相同的卷积核。
空洞卷积能指数级扩大感受野,无需通过堆叠多个池化层或者使用大卷积核就能实现扩大感受野。另外在传统方法中,通常需要使用池化层来降采样,这就会损失空间细节,空洞卷积能在不降采样的前提下获得较大的感受野,适合需要精细定位的任务。而且它的参数量与标准的卷积相同,计算量也基本一致。
但是空洞卷积的膨胀率设置的过高时,卷积核的采样点就会变得非常稀疏,可能无法覆盖所有区域,导致丢失局部连续信息,这就会倒是特征变得不连续,影响对小物体的识别。而且盲目的扩大感受野可能会将完全不相关的信息融合在一起,反而对判断造成干扰。
在使用卷积和池化层获得大感受野时,池化会导致信息丢失,即便是上采样也无法完全恢复,所以可以通过移除池化层,使用一系列逐渐增大膨胀率的空洞卷积来构建网络。
转置卷积
转置卷积就是反卷积,具体的细节看上述的反卷积操作,这里不再赘述。

可变形卷积
可变形卷积赋予了模型自适应调整感受野空间分布的能力,使模型能更好的适应图像中物体的几何形状、尺度和姿态变化等。传统卷积的卷积核是固定的,当需要识别的物体由于某些原因导致出现几何形变时,固定的采样点可能无法与物体的实际轮廓对齐,从而采样到无关的特征。可变形的卷积就是为每个采样点添加一个可学习的偏移量,从而使得卷积核能主动偏移到更有效的位置采样。
可变形卷积是对标准卷积的一种增强,将工作流程分为两个步骤
- 学习偏置:从网络的前一层得到的特征图,通过一个并行的辅助卷积层来处理同一个输入特征图,这个的任务就是预测每个像素点对应采样网络的偏移量,之后输出偏移场。对于 的卷积核,它的采样点数量为 ,辅助卷积层需要为每个像素位置输出 个值,所以输出的偏移场的大小为
- 偏移后卷积:对于输出特征图上的每一个位置,从偏移场中提取出对应的偏移值,之后将偏移量加到标准的规则采样的位置上,得到新的、非规则的采样点。有时候采样点的位置是非线性的,这时候就需要用双线性插值从原始输入图像中计算出这些位置的像素值。最终得到的这些像素值,与卷积核的原始权重进行加权求解,得到最终输出特征图在对应的位置上的值。
可变形卷积对几何变形的鲁棒性很强,可以学会将采样点聚焦于物体的有效区域,无论物体如何缩放、旋转或扭曲。模型可以根据内容学习出任意形状的感受野,而且偏置量的学习是完全自主的,不需要为其提供任何标注信息,模型通过最终的任务损失自动反向传播,学会应该如何偏移才能更好识别。
1x1 卷积
卷积也称为逐点卷积,是深度学习模型中一个看似简单但却功能强大的工具。输入的图像有时候是多个通道的,标准的卷积能同时实现空间卷积和通道融合,而 卷积不会进行空间卷积,它只对输入图像的各个通道进行融合,对每个空间位置上的所有通道的值进行加权线性组合,实现通道融合。
在 卷积中,输入图像的形状为 ,每个卷积核为 ,一共有 个卷积核,最终输出的为 。它保留了图像原本的空间尺寸,只是将各个通道融合了,通常后面会连接一个非线性激活函数来引入非线性。

卷积的主要功能:
- 降维:当 时,这个运算可以大幅度减少通道数,以显著降低后续计算量
- 升维:当 时,它可以扩展特征的维度,在低维特征中创建更丰富的非线性组合
- 通道融合和特征整合
- 增加非线性
旋转等变卷积
旋转等变卷积,旨在解决标准卷积神经网络的一个核心弱点,即对输入旋转的敏感性。旋转等变卷积通过设计一种特殊的卷积层,使输出能自动的结构化地响应输入的旋转。如果输入图像旋转了一个角度,输出特征也会相应的发生变化。
在旋转等变卷积中,对于每个基本的卷积核,预先定义一组它的旋转副本,例如 C4 循环群,也就是 4 个旋转:原始核、旋转 90、旋转 180、旋转 270 之后的核。使用整个旋转核集合分别与输入进行卷积,每个旋转核产生一个方向特定的特征图,这些特征图堆叠在一起,形成一个堆叠的特征图,通道数等于旋转群的大小。
旋转等变卷积的网络无需通过大量旋转增强的数据来学习旋转的不变性,而且对于训练集中从未出现过的旋转角度,其性能通常远优于标准的 CNN,另外旋转核的权重使共享的,也就是旋转核的参数都是原始核的参数,这本身就是一种强的的正则化,提高了参数效率。
经典的卷积网络
LeNet
LeNet5 主要用于识别手写数字,它的基本结构包括 8 层网络结构,其中输入层,2 个卷积层,2 个降采样层,2 个全连接层核输出层
- 输入层接收大小为 的手写数字图像,其中只有单个通道,即灰度图像。在实际使用中,通常对输入图像进行预处理,例如对像素值进行归一化等
- 卷积层 C1 中包含 6 个卷积核,每个卷积核大小为 ,步长为 1,填充为 0,所以这层的最终输出结果为 ,但是在使用中,使用 MINIST 的数据集,它的尺寸只有 ,所以设计这一层时就可以设计填充为 2,最终输出依旧为
- 采样层 S2 采用最大池化,每个窗口大小为 ,步长为 2,所以每个池化层都会从 4 个相邻的特征图中选择最大值,产生一个大小为 的特征图,采用 Sigmoid 激活函数
- 卷积层 C3 包含 16 个卷积核,每个卷积核大小为 ,步长为 1,填充为 0,所以这层的最终输出为
- 采样层 S4 采用最大池化,每个窗口大小为 ,步长为 2,所以每个池化层都会从 4 个相邻的特征图中选择最大值,产生一个大小为 的特征图,采用 Sigmoid 激活函数
- 全连接层 F5 将每个大小为 的特征图拉成一个长度为 400 的向量,并且通过一个带有 120 个神经元的全连接层连接
- 全连接层 F6 输入为上一层的输出 120,包含 84 个神经元,采用 Sigmoid 激活函数
- 输出层由 10 个神经元组成,对应着 0-9 数字,输出最终分类的结果。另外在训练过程中使用交叉熵损失函数计算输出的结果的误差,通过反向传递算法更新卷积核和全连接层的权重参数
这个神经网络在现在看来结构算是比较简单的,虽然简单,但其局部连接、权重共享和空间层次的核心原理,构成了现代计算机视觉深度学习的基石
AlexNet
AlexNet 是深度学习中的一个里程碑式的模型,证明了深度卷积神经网络在复杂视觉任务上的巨大潜力。在 AlexNet 中,使用了 ReLU 激活函数,取代了传统的 Tanh 或 Sigmoid 函数,大大加快了训练速度,缓解了梯度消失的问题,另外它引入局部响应归一化,值旨在增强模型的泛化能力,而且它所使用的池化操作的步长小于池化窗口的大小,使得池化输出之间有重叠,这样可以稍微缓解过拟合。在全连接层中,使用了 Dropout 技术,随机丢弃一部分神经元,很有效地减少了过拟合。
AlexNet 中一共包含 8 个可学习层、输入输出层和池化层,其中 5 个卷积层和 3 个全连接层。
- 输入层接收 的彩色图像,实际上在原论文中为了后续的处理,输入使用的是
- 卷积层 C1 输入为 ,使用 96 个卷积核,卷积核大小为 ,步长为 4,填充为 0,使用 ReLU 作为激活函数,最终输出为 。但是由于输入的图片尺寸为 所以在实际设计这一层时,就做出改变,将填充设置为 2,此时计算的输出的尺寸为 ,向下取整得到 作为输出
- 池化层 S2 采用最大池化,窗口大小为 ,步长为 2,输出为
- 卷积层 C3 采用 256 个卷积核,卷积核的大小为 ,填充为 2,步长为 1,使用 ReLU 作为激活函数,输出为
- 池化层 S4 采用最大池化,窗口大小为 ,步长为 2,输出为
- 卷积层 C5 使用 384 个卷积核,卷积核的大小为 ,填充为 1,步长为 1,使用 ReLU 作为激活函数,输出为
- 卷积层 C6 使用 384 个卷积核,卷积核的大小为 ,填充为 1,步长为 1,使用 ReLU 作为激活函数,输出为
- 卷积层 C7 使用 256 个卷积核,卷积核的大小为 ,填充为 1,步长为 1,使用 ReLU 作为激活函数,输出为
- 池化层 S8 采用最大池化,窗口大小为 ,步长为 2,输出为
- 全连接层 F9 将上一层的输出的特征值展开为一个一维向量,神经元数量为 4096,使用 ReLU 作为激活函数,并且采用 Dropout 正则化,训练时以 0.5 的概率丢弃神经元
- 全连接层 F10 的神经元数量为 4096,使用 ReLU 作为激活函数,并且采用 Dropout 正则化,训练时以 0.5 的概率丢弃神经元
- 输出层的神经元数量为 1000,使用 Softmax 作为激活函数,并且采用 Dropout 正则化,训练时以 0.5 的概率丢弃神经元
AlexNet 神经网络相较于 LeNet 来说,层数更深,神经元和卷积核的数量更多,表达能力就更强
VGGNet
VGGNet 的核心就是探索卷积神经网络的深度与其性能之间的关系,它通过堆叠小型卷积核来构建更深的网络,并且系统的证明增加深度可以有效提升模型性能。相比于上述的 的卷积核,堆叠两个 的卷积核实现的效果与之相同,而且参数也更少,网络更容易训练。而且多个小卷积核的堆叠在中间引入了更多的激活层,从而增加了网络的非线性能力,使得模型对特征的学习更强大。
- 输入层输入 的 RGB 图像
- 预处理中对图像的像素值进行归一化处理。
- 卷积核全部使用 的卷积核,填充为 1
- 池化层中全部使用最大池化,窗口为 ,步长为 2
- 网络的末尾有 3 个全连接层
- 激活函数全部都采用 ReLU
- 在训练中对全连接层使用 Dropout 来减少过拟合
VGGNet 有几个不同的配置,比较著名的就是 VGG-16 和 VGG-19。如下是 VGG-16 的结构
- 卷积块 1
- 2 个拥有 64 个卷积核的卷积层,步长为 1,填充为 1,卷积核的尺寸分别为 和
- 最大池化层 ,步长为 2
- 输出尺寸为
- 卷积块 2
- 2 个拥有 128 个卷积核的卷积层,步长为 1,填充为 1,卷积核的尺寸分别为 和
- 最大池化层 ,步长为 2
- 输出尺寸为
- 卷积块 3
- 3 个拥有 256 个卷积核的卷积层,步长为 1,填充为 1,卷积核的尺寸分别为 和两个
- 最大池化层 ,步长为 2
- 输出尺寸为
- 卷积块 4
- 3 个拥有 512 个卷积核的卷积层,步长为 1,填充为 1,卷积核的尺寸分别为 和两个
- 最大池化层 ,步长为 2
- 输出尺寸为
- 卷积块 5
- 3 个拥有 512 个卷积核的卷积层,步长为 1,填充为 1,卷积核的尺寸为
- 最大池化层 ,步长为 2
- 输出尺寸为
- 分类器,三个全连接层
- 全连接层 1 有 4096 个神经元
- 全连接层 2 有 4096 个神经元
- 全连接层 3 有 1000 个神经元
- 最后连接 Softmax 输出概率
在 VGG-19 与 VGG-16 类似,只是在卷积块 3、4、5 中各多增加了一个卷积层
VGGNet 的结构规整,使用模块化设计,便于理解和搭建,性能强大,但是它们的参数量巨大,特别是最后三个全连接层,所以训练速度较慢
GoogLeNet
GoogLeNet 在 2014 年提出,它不再仅仅追求网络的深度,而是转向关注网络的宽度和内部的计算效率,它通过引入革命性的 Inception 模块,在保持计算预算不变的前提下,极大地增加了网络的宽度和深度,同时解决了计算量爆炸和过拟合的问题。
Inception 模块
在传统的卷积层中,需要人为选择卷积核的尺寸,是否添加池化层等,而且不同的卷积核尺寸擅长捕捉不同范围的特征,例如小卷积核捕捉局部细节,大卷积核捕捉更全局的信息。
引入 Inception 模块的想法就是,在同一个层级上并行使用不同尺寸的卷积核和池化操作,然后将所有的输出结果在通道维度上拼接起来。但是这个结构看来计算成本极高,尤其是 的卷积和池化层之后的卷积,需要很大的计算量。为了解决计算量的问题,GoogLeNet 引入了 卷积,这个卷积可以实现降维,减少特征图的通道数,而且卷积层之后连接激活层,可以增加网络的非线性能力。在 GoogLeNet 中进入大卷积核之前先压缩通道数,进而减少计算量。
GoogLeNet 是一个包含 22 个可学习层和若干池化层的网络,整体的结构是由多个 Inception 堆叠城的,中间穿插着一些用于降低特征图尺寸的池化层。另外 GoogLeNet 在网络中添加了两个辅助分类器,在训练时,将这两个辅助分类起的损失乘以一个小的权重,与主分类器的损失在一起进行反向传播,相当于为梯度的回传提供了捷径,起到了正则化和辅助训练的作用,在预测的时候,这些辅助分类器会被移除。
结构
- 输入层:输入
- 起始部分:一系列的卷积和池化层,快速降低特征图尺寸并且提取初步的特征,输出
- Inception 模块堆叠:堆叠了 9 个 Inception 模块,在这些模块之间,通过设计步长或池化层来逐步降低特征图的高度和宽度,同时不断增加通道数,输出 ,每个 Inception 都包含如下的结构,四个结构分别对输入进行正向传递,之后再将四个结果按照通道组合在一起作为输出
- 卷积路径:用于捕捉极局部的特征或者进行特征组合,激活函数选择 ReLU
- 卷积路径:先通过 卷积降维,再进行 卷积,捕捉局部特征,两个卷积层之后都加入激活层,激活函数都选择 ReLU
- 卷积路径:先通过 卷积降维,再进行 卷积,捕捉更加全局的特征,两个卷积层之后都加入激活层,激活函数选择 ReLU
- 最大池化路径:为了引入池化层的特征,同时为了避免输出的通道数过多,在这之后也加入了 卷积进行降维
- 辅助分类器:两个辅助分类器分别接在第一个和第二个降低尺寸的模块之后
- 平均池化层 ,步长选择 3,这一步大幅度降低了特征图的空间尺寸,聚合了区域信息
- 卷积层,用于大幅度减少通道数量,之后接入 ReLU 函数,增加非线性
- 全连接层将上一步的特征值展平为一个向量,使用 ReLU 激活函数,之后使用
Dropout(0.7)来随机丢弃参数,防止过拟合 - 输出层:输出 1000 个类别,使用 Softmax 作为激活函数
- 输出端:最后一个 Inception 模块后接一个全局平均池化,将特征图直接池化为 ,使用池化层取代了巨大的全连接层,极大地减少了参数的数量。然后再连接一个包含 1000 个神经元的全连接层作为输出。
GoogLeNet 通过卷积降维和全局平均池化,参数量大大减少,而且在测试中也取得了高的准确率。但是相较于前面所介绍的几种卷积神经网络,它的 Inception 模块的设计和连接方式都比较复杂,不容易修改和调整。这个网络确实比较复杂,这里所绘制的就是本人实际搭建的网络的样子,可能会有些错误

在网络中,每一层的输入和输出的通道的参数如下,这个表比较复杂,如下表所示

ResNet
ResNet 即残差网络,证明了超深网络可以有效训练,并且超越了传统的 CNN 网络结构,它的核心思想就是解决网络退化的问题,让超深的神经网络也能被有效地训练。在普通深度网络中,每一层都直接学习一个目标函数,当网络很深时,直接学习就会变得困难(梯度消失或爆炸,导致学习困难)。ResNet 提出了一个想法,就是不去学习完整的映射,而是这个映射与输入之间的残差。
上述思想的实现通过残差块来实现,一个基本的残差块的结构包含如下
- 主路径:通常由两个或多个权重层组成,负责学习残差
- 快捷路径:直接将输入绕过主路径加到主路径的输出上
残差块最终的输出为 。随着网络深度的增加,ResNet 中提出了两种不同设计的残差块
- 基本块:用于较浅的网络,由两个连续的 卷积层构成,当需要改变特征图的尺寸或者通道数时,快捷路径上会使用一个 的卷积进行投影,以确保尺寸匹配
- 瓶颈块:用于更深的网络,目的是减少计算量。由 3 个卷积层构成,总体实现了先压缩后处理再扩展的方法,再保持性能的同时,提升了计算的效率
- 卷积,用于降维,减少通道数以降低计算复杂度
- 卷积,在较低维度的空间上进行标准卷积计算
- 卷积,用于升维,将通道数恢复或者增加以匹配输出维度

整体的网络结构
如下图所示,整体的网络主要分为 3 个部分,整体的结构和层的输入输出尺寸图如下面所示
- 起始部分:使用卷积核为 的卷积层,降维
- 残差块结构:使用多个残差块堆叠形成
- 设置步长为 2 时主要用于下采样
- 输出端:最后一个残差块之后连接一个平均池化层,再连接全连接层,用于输出最终的图像分类结果

这里有个需要注意的点,由于在 ResNet50 之后的网络,都是使用的瓶颈块,在瓶颈块中,第一层卷积是降维度的,将上一层的输出降低维度,然后给第二层做卷积操作,然后第三层进行升维度。例如图中的 50-layer 的 conv3,它的输入的通道数为 256,conv3 中的 4 个瓶颈块的第一层和第二层的卷积核的数量是 128,而第三层的卷积核的数量是 512,所以 conv3 的第一个块的输入是 256,其他块的输入都是 512。如图所示,图中展示的就是 conv3 的各个块输出的图像的尺寸和通道数量,除了第一个块以外,其他的块都是一样的,所以这里就只画了两个不一样的块的情况。

另外需要注意的就是 conv2 的块不需要进行下采样,因为它前面的池化层已经将图像的尺寸调整到 conv2 的输出尺寸了,而其他的 conv 都是利用了卷积实现了下采样增大图像的感受野的。
DenseNet
传统的卷积神经网络的前向传播使得信息从输入层到输出层流动时,可能会逐步变得小,DenseNet 通过让网络中的每一层都直接与后面的所有层相连,极大的促进了特征在层之间的重用,缓解了梯度消失的问题,而且减少了参数的数量,加强了特征的传播。

密集块
密集块是 DenseNet 网络的核心结构组件,一个密集块是由多个层组成的,块内的每一个层都接收前面所有层的特征图作为输入。例如对于一个密集块来说,如果这个密集块输入 个特征图,而前面的层每一层都会产生 个特征图,那么这个块内的第 层输入的特征图的数量为 。在 DenseNet 中,每个层都会与前面的所有层在 channel 维度上连接在一起,作为下一层的输出如。每个密集块中的层的结构如下
- BatchNorm 层:批量归一化
- ReLU 层:激活函数层
- 卷积层,在执行后面的 卷积之前,先减少特征图的通道数,起到降维的作用,用于提升计算效率。加入这一层的增长率为 ,在这一层通常会产生 个特征图。卷积核的步长为 1,填充为 0
- BatchNorm 层:批量归一化
- ReLU 层:激活函数层
- 卷积层:主要的特征学习的步骤,学习经过前面的 卷积降维之后的特征图,并且产生精确的 个特征图,就是该层新学习到的特征,卷积核的步长为 1,填充为 1
过渡层
由于密集块会不断拼接特征图,导致通道数会快速增长,计算量会变得非常大,而过渡层的作用就是压缩模型复杂度和特征图的尺寸。它的结构通常由一个 卷积和 平均池化组成。卷积用于减少特征的图的通道数,设计输出的通道数为输入通道数的 倍,通常为 0.5。池化层是将特征图的高和宽减半。
- BatchNorm 层:批量归一化
- ReLU 层:激活函数层
- 卷积层:用于降维,压缩通道数
- 均值池化层:降低图片尺寸,下采样
增长率
增长率 就是密集块的每个层新产生的特征图数量。它控制着每一层为全局的状态贡献的信息的数量,一个较小的值就足够取得很好的效果了,后续层也能访问到大量的信息。
整体网络结构
不同的网络结构,它里面所使用的每个密集块内的层数也不一样,如下图所示
- 初始卷积层:在进入第一个密集块之前,会对输入图像进行一个单独的卷积,然后接一个池化层,用于快速下采样
- 多个密集块+过渡层:网络主体由多个密集块串联而成,每个密集块之间由一个过渡层连接
- 分类层:在最后一个密集块之后,执行一个全局的平均池化,再将特征图转为一个固定大小的向量,最后接一个全连接层,输出分类结果

DenseNet 中存在到输出层的最短路径,所以梯度可以直接反向传播,训练更深的网络就变得容易了。每一层都可以直接利用所有先前层的特征,强化了特征的传播。由于增长率 通常很小,并且特征图是通过拼接而非相加来结合,模型参数数量显著减少。另外密集连接方式具有类似 Dropout 的正则化效果,有助于减少过拟合。
MobileNet V1
MobileNet 是一种为移动设备和嵌入式视觉应用提供的轻量级、低延迟的神经网络模型。传统的卷积神经网络的计算量巨大的根源就是标准卷积操作,在 MobileNet V1 的核心创新点就是引入了深度可分离卷积,它将标准卷积分解为两个独立的层,从而大幅度减少计算量和参数的数量。
标准卷积的一个卷积核同时在输入特征图的所有通道上进行滑动,生成输出特征图的一个通道,需要多个卷积核才能生成多个输出通道,所以计算量非常大。而对于深度可分离卷积来说,深度卷积单独对每一个输入的通道进行空间卷积,使用对应数量的单通道的卷积核,每个卷积核都只与对应的一个输入通道进行卷积,最终产生的特征图的通道数与输入的通道数一致,这就能极大地减少计算量,但是却没有进行通道之间的信息交流。所以在这之后加入一个 卷积,将上层的多个通道进行融合,最终生成需要通道数量的特征图。整个网络的结构如下
- 标准卷积层,卷积核尺寸为 ,步长为 2,填充为 1,进行快速下采样
- 核心模块,中间部分堆叠多个核心模块实现压缩特征图尺寸,增加通道数
- 深度卷积+BatchNorm+ReLU,卷积核尺寸为 ,填充为 1,步长根据需要确定,如果此处需要下采样来降低图像的尺寸,就设置步长为 2
- 逐点卷积+BatchNorm+ReLU,主要用于改变通道数,深度卷积只负责卷积和下采样,不负责增加通道数,逐点卷积就主要是融合各个通道,增加通道数
- 下采样
- 输出端:全局平均池化+全连接层,用于分类
为了进一步的压缩模型,MobileNet V1 中引入了两个简单的超参数,通过调整这两个超参数,可以在模型的大小、速度和准确率之间进行权衡
- 宽度乘子 ,在每一层都均匀地减少通道数,使所有层的通道数变为原来的 倍
- 分辨率乘子 ,降低输入图像和中间特征图的分辨率。例如分辨率乘子设置为 时,每一层的输入就变成了 192,96,48,24,12,6,最终的那个平均池化层也要修改尺寸。在 MobileNet 的测试中发现,192 的分辨率的识别准确率要比 224 的低一些,但是模型的计算量也较少了一些,所以可以通过调节分辨率因子来调节特征图的分辨率
整个 MobileNet V1 的网络结构如下表所示

MobileNet V2
尽管上述的 MobileNet V1 非常高效,但是它仍然存在两个主要的问题
- 深度卷积的卷积核数量少,容易导致训练得到的特征参数不够
- MobileNet V1 的结构非常简单,灭有类似于 ResNet 那种短路的连接,所以它的梯度传播的路径非常长,就无法训练深度太深的网络
此时 MobileNet V2 网络引入了倒残差结构和线性瓶颈层来解决这些问题
倒置瓶颈块
在 ResNet 中的残差瓶颈块中,它的思想是第一个逐点卷积降低图像通道数,第二个逐点卷积增加图像的通道数,为中间的标准卷积层进行降维操作以降低计算量。而这里使用的结构与它的相反,是第一个逐点卷积层增加图像通道数,经过卷积处理之后再经过逐点卷积降低图像的通道数。
- 逐点卷积输升维,使用 ReLU6 激活函数
- 深度卷积提取特征,使用 ReLU6 激活函数,另外如果需要下采样的操作,也是在这一层中完成
- 当深度卷积层的步长为 1 时,此时输入通道数等于输出通道数,此时构建块中存在残差连接
- 步长为 2 时主要用于下采样,没有残差连接
- 逐点卷积降维,使用线性激活函数,降维至整个倒置瓶颈块的输出维度
线性瓶颈层
对于经过压缩的特征张量,如果使用 ReLU 这种非线性的激活函数,会造成大量的信息丢失,因为 ReLU 的公式来看,它会设置所有的负值为 0。如果在网络中有大量的负值信息,经过 ReLU 之后就会被破坏掉了。所以此时在瓶颈层的输出后,不使用非线性的激活函数,而是使用线性的激活函数来保留信息。
整体的结构
- 标准卷积层,卷积核尺寸为 ,步长为 2,填充为 1,进行快速下采样
- 主体由一系列的倒置瓶颈块堆叠成
- 第一个倒置瓶颈块的中间层并没有进行升维
- 后续的倒置瓶颈块进行升维
- 另外,下采样只发生在每一个阶段的第一个倒置瓶颈块中
- 输出端:
- 使用一个逐点卷积,将通道数提升,旨在将特征映射到一个非常高维的空间以丰富特征,为最终的分类做准备
- 全局平均池化层
- 逐点卷积作为分类器,最终输出的通道数为分类数

如表中所示,就是 MobileNet V2 的网络结构,其中 t 表示中间的倒置瓶颈块内部升维操作的通道提升倍数,c 就是对应的这一层输出的通道数,n 就是这一层包含对应的网络结构的数量
MobileNet V3
MobileNet V3 是 Google 在 2019 年推出的的轻量级网络,核心目标就是在保持高精度的同时,极大程度上提升在移动设备或嵌入式设备上的运行速度。它基于 MobileNet V1 的深度可分离卷积和 MobileNet V2 的反向残差结构和线性瓶颈,并且融入了神经架构搜索技术以及一些新颖的激活函数和结构的改进
- 基于 MobileNet V2 的反向残差架构+深度可分离卷积进行扩展,结构如下
- 逐点卷积层:用于升维
- 深度卷积层:可以选择卷积核为 或者 的卷积层
- 可以加入注意力模块,该模块能自适应地校准通道特征响应,提高精度
- 逐点卷积层:用于降维
- 如果该网络块的输入与输出维度相同时,可以引入残差
- SE 注意力模块:对每个通道进行权重调整,增强特征的表达能力,注意力模块通过小成本获取大提升
- 新的激活函数
h-swish函数:标准的 激活函数的计算量比较大,所以在 MobileNet V3 中提出了 h-swish 函数,使用ReLU6来近似sigmoid函数,计算更加高效,激活函数为 。这个函数在保留了 swish 函数的非单调性和平滑特性的同时,大大降低了计算的成本。 - NAS 自动优化找到更合适的结构,网络的头部和尾部并非人工设计,而是由 NAS 自动搜索得来的,并且利用 NetAdapt 对层内参数进行微调,用以在延时和精度之间取得更好的平衡
MobileNet V3 提供了两个版本,即 Large 高精度版本和 Small 低延迟版本,它们的核心结构是一样的,只是在深度和宽度上有所不同。如图所示,左侧的为 Large 高精度版本,右侧为 Small 低延迟版本。

MobileNet V4
MobileNet V4 的核心思想就是打造通用的模型,也就是一个模型在多种硬件平台上都能实现高性能和低延迟,平衡高准确率与低成本计算,适配图像分类、目标检测、语义分割等多种视觉任务。其中它的个最大突破就是提出了 Mobile Mamba 和 Universal Inverted Bottleneck 模块。
Universal Inverted Bottleneck

这是 MobileNet V4 的基础构建模块,它是在 Inverted Bottleneck 块的基础上扩展而来的,它并不是一个实例块,而是一种架构,整体的架构为
- 初始深度卷积层
- 逐点卷积层,用于升维
- 中间深度卷积层
- 逐点卷积层,用于降维
后续的几个模块都是在此基础上进行的调整得到的,例如 IB 就是去掉了初始深度卷积层,而 ConvNext 模块就是去掉了中间深度卷积层,FNN 就是只剩下了逐点卷积层。
Inverted Bottleneck
倒置瓶颈模块,就是 MobileNet V2 中设置的倒置瓶颈模块,两者结构一致
- 逐点卷积输升维,使用 ReLU6 激活函数
- 深度卷积提取特征,使用 ReLU6 激活函数,另外如果需要下采样的操作,也是在这一层中完成
- 当深度卷积层的步长为 1 时,此时输入通道数等于输出通道数,此时构建块中存在残差连接
- 步长为 2 时主要用于下采样,没有残差连接
- 逐点卷积降维,使用线性激活函数,降维至整个倒置瓶颈块的输出维度
Fused Inverted Bottleneck
它是在 MobileNet V4 中的融合倒置瓶颈模块,它是该模型中用于特征提取的基础轻量化结构,常作为网络前期的特征处理模块,和 MobileNet V4 的核心的 UIB 的模块搭配使用。
它的核心就是融合+倒置瓶颈块,倒置瓶颈块是 MobileNet 系列经典结构,通过逐点卷积先升维、再用深度卷积提取特征、最后逐点卷积降维,在保证表达能力的同时减少了计算量。而 FusedIB 在此基础上错了融合优化,简化了部分冗余结构,更适配移动端低算力场景,它经常被部署在 MobileNet V4 的浅层,负责初步提取图像基础特征,为后续的 UIB 模块的深层特征处理打下基础。
- 普通卷积,直接进行卷积计算,捕捉局部纹理与边缘特征,这一步可以设置步长为 2 来进行下采样,后接 BatchNorm 与 ReLU6 激活函数
- 逐点卷积:将通道数压缩回输出通道数,完整特征融合和维度还原,后接 BatchNorm,没有激活函数
- 如果输入尺寸和输出尺寸一致,就进行残差连接,输出与输入相加,否则直接输出
ExtraDW
是倒置瓶颈的变体,以极低的计算成本增加网络深度与感受野
- 起始深度卷积,卷积核尺可设置为 或 ,可设置步长为 2 以实现下采样,后接 BN+ReLU6
- 逐点卷积+BN+ReLU6,扩展输入通道数,升维
- 中间深度卷积,卷积核尺寸可以设置为 或 ,接 BN+ReLU6
- 逐点卷积,降维至输出通道数,后接 BN
- 残差连接,如果输入输出维度对齐,启用残差连接
ConvNext
将 ConvNeXt 的大核空间混合思想融入倒置瓶颈中,在 UID 中作为大感受野路径,兼顾精度和效率
- 大卷积核深度卷积,后接 BN+ReLU6
- 逐点卷积,用于升维,后接 BN+ReLU6
- 逐点卷积,降维,后接 BN
- 残差连接,如果输入输出维度对齐,启用残差连接
FFN
是 UIB 模块中的通道交互路径,仅通过逐点卷积实现非线性特征变换
- 逐点卷积,扩展通道,升维,后接 BN+ReLU6
- 逐点卷积,降维,后接 BN
- 残差连接,如果输入输出维度对齐,启用残差连接
Mobile-MQA

Mobile-MQA 是面向视觉任务设计,核心是降低注意力的内存带宽与计算冗余,同时保留空间定位精度,整个过程比较复杂。
- 维度转换,将输入图像的维度转换为 的形式
- 在此分为两个部分,左侧利用全连接层和多头拆分成 ,右侧全连接层输出 ,之后右侧拆分成两部分 和
- 将 K 和 V 进行维度恢复为 ,将 Q 进行维度恢复为
- 对 K 和 V 使用同一卷积层进行下采样操作,输出尺寸为
- 将序列 K 和 V 展平,展平之后尺寸为
- 缩放点积注意力: ,其中 为缩放系数,缓解梯度消失。后接 Softmax 注意力权重,这一步之后可以选择使用 DropOut 函数。之后计算 ,输出尺寸为 作为注意力矩阵
- 多头拼接与投影:将 重新调整尺寸为 ,接全连接层融合多头特征,恢复通道维数。可选择 DropOut 函数。
- 2D 恢复,恢复特征图尺寸为 ,接激活函数 ReLU6 或 SiLU
- 残差连接:根据输入输出通道数是否一致,可以选择是否启用残差连接,以缓解深层梯度消失
- 最终输出
EfficientNet V1
EfficientNet 系统地研究了网络的深度、宽度和分辨率之间的缩放关系,并且提出了复合缩放的方法
- 深度:网络的层数,更深的网络可以捕获更复杂、更抽象的特征,但也更难训练,容易梯度消失或爆炸
- 宽度:特征图的通道数,更宽的网络可以捕获更细粒度的特征,但过宽会导致特征冗余,计算量增大
- 分辨率:输入图像的尺寸,分辨率越高保存的细节信息就越多,但是计算量越大
传统的方法通常只是缩放其中的一个维度,而在 EfficientNet 中,认为这三个维度是相互依赖的,不平衡的缩放会导致模型很快就达到性能的瓶颈。所以提出使用一个复合系数 来同一缩放三个维度
- 深度
- 宽度
- 分辨率
- 约束条件
其中 是通过在基准小模型上网格搜索确定的常数,实际上就是随着模型的增大,需要同时增加网络的深度、宽度和输入图像的分辨率,并且按照一个最优的比例进行。为了应用这个复合缩放,需要一个表现良好的基准网络,所以在文章中作者通过神经架构搜索得到了一个高效的基础模型 EfficientNet-B0,对于 EfficientNet-B0 来说,得到的 。
另外在 EfficientNet 中,激活函数基本上都使用 swish 函数,函数表达式为
关键构建块 MBConv

EfficientNet-B0 的核心就是 MBConv 模块,它基于 MobileNet V2 的反向残差结构,并且加入了 SE 注意力机制。模块的结构如下
- 逐点卷积,将输入通道扩展,通常扩展为 4 或 6 倍,增加了通道数之后,方便在后续的深度卷积中提取更多的特征
- 深度可分离卷积,使用 或者 的深度卷积,负责进行空间特征提取
- SE 注意力模块,将学习到的权重乘回到对应的特征通道上,实现通道注意力,让网络更关注重要的特征
- 逐点卷积,将通道数压缩到输出维度
- 如果输入和输出的特征图尺寸和通道数一致,就添加一个残差连接

上述图中就是 EfficientNet-B0 的网络结构,其中 MBConv1 表示扩展因子为 1 的 MBConv,而 MBConv6 表示扩展因子为 6。EfficientNet 具有较高的性能,并且提供了一条模型放大路径,方便开发者在精度和速度之间进行权衡。MBConv 是轻量级网络设计,平衡了表达能力和计算成本。下面的是 EfficientNet-B0~B7 之间的深度系数、宽度系数和分辨率表,上述表格中的深度系数影响每一个 Stage 中 MBConv 的层数,宽度系数影响每一层的输出通道数。从 B1~B7 相对于 B0 来说,整体的结构并没有改变,只是相当于是 B0 的比例放大版。
| Model | Width | Depth | Resolution |
|---|---|---|---|
| B0 | 1.0 | 1.0 | 224 |
| B1 | 1.0 | 1.1 | 240 |
| B2 | 1.1 | 1.2 | 260 |
| B3 | 1.2 | 1.4 | 300 |
| B4 | 1.4 | 1.8 | 380 |
| B5 | 1.6 | 2.2 | 456 |
| B6 | 1.8 | 2.6 | 528 |
| B7 | 2.0 | 3.1 | 600 |
EfficientNet V2
EfficientNet V2 是 Google 在 2021 年提出的改进版本,主要是针对训练速度慢和参数使用效率低的问题进行优化,保持它 V1 的优势的同时,引入了新的网络结构和训练的策略。如下图是 EfficientNetV2-S 的网络结构

引入 Fused-MBConv
在浅层网络使用 Fused-MBConv 代替部分的 MBConv,用以减少内存访问开销,加速训练,Fused-MBConv 将 MBConv 中的深度可分离卷积替换为普通的 卷积,更适合在浅层提取信息。
- 卷积:调整步长来实现下采样操作,输出的通道数是输入通道数乘以通道数扩展系数,实现升维操作,激活函数使用 Swish 函数
- SE 注意力模块,将学习到的权重乘回到对应的特征通道上,实现通道注意力,让网络更关注重要的特征
- 逐点卷积:降维
- 如果输入的尺寸与输出的尺寸一致,就使用残差连接结构

EfficientNet V2 相较于 V1 来说,训练速度更快,内存使用更少且推理速度也更快。而且 EfficientNet V2 在缩放的方面,使用的参数也更保守了,避免了 V1 中的过度缩放的问题,减少了参数冗余。另外还使用了渐进式训练策略,训练时动态调整图像尺寸和正则化强度等,加快了训练速度,并且提高了精度。
| Model | Width | Depth | Resolution | Dropout |
|---|---|---|---|---|
| B0 | 0.75 | 0.75 | 224 | 0.2 |
| B1 | 0.75 | 1.0 | 240 | 0.2 |
| B2 | 0.75 | 1.0 | 260 | 0.2 |
| B3 | 1.0 | 1.2 | 300 | 0.2 |
| S | 1.0 | 1.0 | 300 | 0.2 |
| M | 1.0 | 1.0 | 384 | 0.3 |
| L | 1.0 | 1.0 | 480 | 0.4 |
其中的 EfficientNetV2-S 平衡了速度和精度,EfficientNetV2-M/L 可以在需要更高精度下使用,EfficientNetV2-B0/B1/B2 在资源受限时使用。
ConvNeXt
ConvNeXt 是 2022 年提出的一中纯卷积神经网络架构,核心思想就是将标准卷积网络进行现代化改造,使得其性能媲美甚至超越 Transformer 模型。ConvNeXt 是通过逐步改造 ResNet-50 实现的,它完全使用卷积来实现。
ConvNeXt Block
残差块是根据 ResNet 设计出来的,结构如下
- 深度可分离卷积,大核卷积
- LayerNorm:对每个样本内部做归一化,不依赖批量大小
- 逐点卷积:升维操作
- GELU 激活函数
- 逐点卷积:降维
- DropPath:随机丢弃某些层
- 残差连接
下采样块
在 ConvNeXt Block 中不进行下采样操作,有单独的下采样块进行下采样操作
- 卷积层,步长设置为 2,填充为 0
- LayerNorm:对每个样本内部做归一化,不依赖批量大小

网络的结构如上图所示,需要注意的是,在下采样层都会将特征图的通道数增大一倍,而且将特征图的宽和高都缩小到原来的一半。另外 ConvNeXt 存在一些变体,这些变体的结构都大体一致,只是在每一个部分的特征图的通道数不一致,如下图所示,表中就是各个变体的尺寸表
| 版本 | C | n1 | n2 | n3 | n4 |
|---|---|---|---|---|---|
| Tiny | 96 | 3 | 3 | 9 | 3 |
| Small | 96 | 3 | 3 | 27 | 3 |
| Base | 128 | 3 | 3 | 27 | 3 |
| Large | 192 | 3 | 3 | 27 | 3 |
| XL | 256 | 3 | 3 | 27 | 3 |
ShuffleNet V1
ShuffleNet 设计之初旨在为计算能力有限的移动设备设计一个高效且高精度的卷积神经网络,它的设计核心就是在有限的预算下,最大化网络的表达能力和精度。在 ShuffleNet 之前,轻量化网络的方案基本上都是使用的深度可分离卷积或分组卷积的方案。但是这两个技术直接结合起来的话,一般会使用逐点卷积,但是这个逐点卷积回占据轻量级网络的大部分计算量,造成通道阻塞,如果对逐点卷积也使用分组卷积的话,会导致不同组之间的通道完全没有信息交流,从而削弱模型的表征能力。
ShuffleNet 的核心点就是为了解决分组卷积导致的通道信息隔离的问题。主要有两大核心组件,如下
通道重排
这个操作的目的就是在组间打乱通道的顺序。对于一个有 组的卷积层输出特征图,将其通道维度重新组织,确保后续的输入能够来自于不同的组,这个操作在不增加计算成本的前提下,实现了跨组的信息交流,增强了通道之间的相关性。这个操作通常是通过一个内存重塑和转置操作实现。
ShuffleNet 单元
这个单元的结构类似于 ResNet 中的瓶颈块,结构如下,如下图中左侧
- 逐点分组卷积,用于升维或者降维
- 通道重排,打乱上一步输出的特征图的通道
- 深度可分离卷积,提取空间特征,设计步长为 1
- 逐点分组卷积,恢复通道的维度
- 设置残差连接结构
ShuffleNet 下采样单元
这个单元专门进行下采样,与上述的单元结构不一样,会一些差别,如下图中右侧
- 逐点分组卷积,用于升维或者降维
- 通道重排,打乱上一步输出的特征图的通道
- 深度可分离卷积,提取空间特征,这一步设置步长为 2,进行下采样
- 逐点分组卷积,恢复通道的维度
- 残差连接线路增加了一个额外的平均池化层,步长为 2,保证与主分支上的特征图尺寸一致,之后与主分支的输出在通道维度上进行拼接,代替了原来的相加操作

ShuffleNet 的网络结构如下
- 初始卷积层处理,进行快速下采样
- 卷积层
- 最大池化层
- 中间部分:有多个阶段,每个阶段都由 ShuffleNet 堆叠而成,每个阶段的第一个单元都执行下采样,后续的单元保持分辨率
- 输出端:利用全局平均池化层和全连接分类层进行分类

ShuffleNet V2
ShuffleNet V2 作为面向移动端的轻量级卷积神经网络,核心解决了 ShuffleNet V1 中理论计算量低但实际推理速度慢的问题,所以它的设计围绕真实的硬件运行特性来展开。它的关键设计准则如下
- 使用相同的通道宽度以最小化内存访问成本,即当卷积层的输入和输出通道数相等时,所以设计网络单元时,尽量让分支的输入输出通道保持一致
- 过度使用分组卷积会增加内存访问成本,过大的组数导致访问成本增加,所以谨慎使用大组数的分组卷积。ShuffleNet V2 中主要使用通道混洗来实现组间信息交流。
- 网络碎片化会降低并行度,过于复杂的多路径结构,虽然可能提升精度,但是引入了大量碎片化操作。
- 尽量减少逐元素操作,例如 ReLU,Add等操作,它们的内存访问量和内核启动的开销较大,所以就要尽量减少逐元素操作的数量。
ShuffleNet V2 的核心是两种构建块,即针对步幅为 1 和步幅为 2 的两种情况

步幅为 1 的基本单元
这个基本单元是网络的骨干,结构如下
- 通道分割,将输入分成左右两个分支
- 主要计算集中在右侧分支,左侧分支直接保留,下面的计算都是右侧分支的计算
- 逐点卷积,这里不再使用分组卷积了,降低了内存访问成本
- 使用 深度可分离卷积,降低计算量
- 将左右两个分支拼接,两个分支的信息融合,之后通过通道混洗操作,让信息在组间流动。
步幅为 2 的基本单元
当需要减小特征图分辨率、增加通道数时使用
- 不使用通道分割,由于需要增加通道数,所以不再进行通道分割,依然分为左右两个通道,只是左右两个通道都是输入的拷贝
- 对左右两侧分支都进行下采样
- 左侧:步长为 2 的逐点卷积操作,再进行 深度可分离卷积
- 右侧:步长为 2 的 深度可分离卷积
- 执行完下采样之后,左右两侧都执行逐点卷积
- 最终将两个分支合并,由于两个分支输出的通道数都与原来输入的通道数一致,所以最终拼接之后的通道数翻倍
ShuffleNet V2 通过堆叠上述的两种基本单元,并且按照阶段组织起来,形成完整的网络结构,一般有多个配置版本,例如 等,这些乘数因子用于控制整体的通道数量。如下图所示

ShuffleNet V2 的设计为后续的轻量化网络设计提供了极具价值的指导准则。它通过通道分割+恒等映射创造了高效且利于硬件并行计算的块结构。它通过通道混洗操作,有效促进了通道间的信息交流,避免了分组卷积带来的副作用。
GhostNet
GhostNet 是在 2020 年提出的一种高效的轻量级的神经网络,旨在用更少的计算量生成丰富的特征图。
传统的 CNN 卷积层中会生成大量冗余的特征图,即很多特征图之间高度相似,所以使用大量的卷积来计算所有这些相似的特征图是计算浪费的。所以在 GhostNet 中提出了一个新颖的解决方案先用少量的标准卷积生成一部分内在的特征图,再对每张特征图施加一系列线性操作来生成更多与之相似的特征图(幽灵),最后将内在特征图和幽灵特征图拼接起来,得到与普通卷积层数量相同的输出。
Ghost Module

Ghost Module 是整个网络的关键所在,它的功能就是替代一个标准的卷积层
- 输入特征图 ,目标输出通道数为
- 标准卷积路径:使用标准卷积,输出通道减少,输出特征图通道数为
- 幽灵生成路径:对上述生成的每一个特征图,应用一系列线性操作,每个内在特征图都会生成 个幽灵特征图,这些操作都是在单独的通道上独立进行的,计算量很小
- 可以选择是否插入 SE 模块
- 特征图拼接:将 个内在特征图与 幽灵特征图进行拼接,最终输出尺寸为
Ghost 单元

这是 GhostNet 的基础构建块,分为步长为 1 和步长为 2 的两种
- 对于步长为 1 的 Ghost 单元
- 使用 Ghost Module,扩展通道,即升维操作,接 BatchNorm 归一化操作和 ReLU 激活函数
- 使用 Ghost Module,降维操作,接 BatchNorm 归一化操作
- 使用残差连接模块
- 对于步长为 2 的 Ghost 单元
- 使用 Ghost Module,扩展通道,即升维操作,接 BatchNorm 归一化操作和 ReLU 激活函数
- 深度卷积模块,后接 BatchNorm 归一化操作
- 使用 Ghost Module,降维操作,接 BatchNorm 归一化操作
- 在残差连接的分支上,连接有卷积模块和 Ghost Module 模块。其中卷积模块主要作用就是下采样,使得与主分支维度一致,后续的 Ghost Module 的卷积核尺寸为 1,相当于是替代了深度可分离卷积中的逐点卷积部分,主要作用就是通道间的交流和调整输出通道数量
网络架构
GhostNet 网络的整体架构类似于 MobileNetV3,只是使用 Ghost 模块替代了其中的核心部分,而且全局使用 h-swish 函数作为激活函数
- 初始卷积:下采样,选择卷积核尺寸为 ,步长设置为 2,输出通道数为 16
- 一系列的 Ghost 模块
- 输出端:使用逐点卷积调整输出通道数,连接池化层和全连接层,输出分类类别

RepVGG
RepVGG 是在 2021 年提出的卷积神经网络的架构。它在训练过程中使用了一个复杂的多分支结构,在推理时将其等效转化为一个轻量快速的单路的网络,它完美的平衡了训练时的强大性能和推理时的高效简洁。RepVGG 的核心就是结构重参数化,这就意味着网络在训练和推理阶段拥有不同的框架,但是两者在数学上完全等效。总体上实现的是使用多分支架构带来的训练优势和性能,同时获得单路架构的网络的推理速度。
- 训练阶段使用一个高性能且易于优化的多分支结构
- 推理解算通过数学转换,将多分支结构融合成一个纯单路无分支的卷积网络
训练时的 RepVGG 单元架构
在 RepVGG 的基本构建块在训练时时一个三分支的残差单元
- 主分支,恒等映射,当输入输出通道不同或者步长为 2 时,退化为一个逐点卷积,设置步长为 2,并且带有 BatchNorm 归一化
- 残差分支,一个逐点卷积层+BatchNorm 归一化层
- 卷积分支,一个 卷积层+BatchNorm 归一化层
三分支相加之后,再使用激活函数 ReLU
推理时的 RepVGG 单元架构
推理的目标结构是极简的网络结构,它内部没有分支
- 一个 卷积层
- ReLU 激活层
- 没有 BatchNorm 层
结构重参数化转换
- 融合 Conv 层和 BatchNorm 层
- BatchNorm 归一化的公式为 ,其中 是这个 batch 计算得到的均值和方差, 是为了防止除零而设置的一个极小值, 是缩放系数, 是平移系数。所以上述的 BatchNorm 公式可以写作
- 对于 的卷积层,将卷积层输入的的每个卷积 的部分 reshape 为一个维度为 的向量 ,此时两个层的操作为
- 将两个层融合之后,得到一个新的卷积层,它的参数为
- 这个操作在 pytorch 官方已经给出实现了
torch.nn.utils.fuse_conv_bn_eval
- 将多分支卷积融合为单分支卷积,由于 RepVGG 有三个分支,每个分支都是一个卷积层(或者是融合了 BN 之后的卷积层),要对每个分支都做一些操作。
- 卷积参数,权重为 ,偏置为
- 卷积参数,权重为 ,偏置为 ,可以看作是中心权重为 ,四周为 0 的 卷积
- 恒等映射可以看作是一个中心权重为单位矩阵 ,四周用 0 填充的 的卷积,偏置为 0
实际上上述的多分支融合的操作主要就是零填充和对齐操作,将逐点卷积核恒等映射的卷积核都用 0 填充到 的尺寸,然后将这三个卷积核相加,得到一个新的 的卷积核 。另外也需要将三个分支也直接相加得到新的偏置 。最终融合之后就等价于一个 的卷积层,带有一个 ReLU 的激活层。
RepVGG 定义了多个规格,整体的架构都是一样的,只是有些参数不同。结构如下
- 初始卷积层,一个 卷积,步长为 2,填充为 1
- 四个阶段:每个阶段都由若干个 RepVGG 单元堆叠而成
- 每个阶段第一块通常进行下采样
- 随着阶段深入,通道数翻倍
- 全局平均池化+全连接层分类


后记
卷积神经网络的学习就先告一段落了,在这里确实花费了很多时间,不过确实学到很多,卷积神经网络的结构和很多操作确实有趣,后续会慢慢继续学习的


