计算机视觉CV的发展
整体网络架构
卷积层和激活函数(ReLU)的组合是网络的核心组成部分
激活函数(ReLU)
引入非线性,增强网络的表达能力。
卷积层
负责特征提取
池化层(Pooling Layer)
它在网络中起到加速和降维的作用。
全连接层(FC)
全连接层将卷积和池化后的特征图转换为分类任务所需的特征向量。
特征图的变化过程
随着网络的深入,特征图的尺寸会发生变化,这取决于卷积核的大小和步长。特征图的维度在实际应用中可以根据任务需求自行设置卷积核的数量和大小,以及池化层的参数。
数据输入:网络接收原始图像数据,通常是一个多维数组,表示为高度、宽度和颜色通道(如RGB图像的3个通道)。
卷积层:图像通过卷积层,每个卷积核(或滤波器)在图像上滑动,执行卷积操作以提取局部特征。这通常会导致特征图的尺寸增加,因为每个卷积核都会生成一个新的特征图。
激活函数:卷积操作后,通常会应用一个激活函数(如ReLU),以引入非线性,增强网络的表达能力。
池化层:为了降低特征图的维度,减少计算复杂度,并提取更抽象的特征,会应用池化操作(如最大池化或平均池化)。这会导致特征图尺寸的减小,但保留最重要的特征。
重复卷积和池化:这个过程会多次重复,每次都会提取更高层次的特征,同时特征图的尺寸逐渐减小。
展平:在网络的末端,特征图会被展平为一个一维向量,因为全连接层(FC层)只能处理一维数据。
全连接层:展平后的特征向量通过全连接层,这一层负责将提取的特征映射到最终的分类结果。全连接层的输出节点数量通常等于分类任务的类别数量。
输出:全连接层的输出通过一个softmax激活函数(对于多分类任务),将输出转换为概率分布,每个类别的概率值表示该类别的预测概率。
经典网络
Alexnet
- 年份:2012年
- 特点:
- 使用ReLU激活函数代替传统的Sigmoid或Tanh,加速训练。
- 使用Dropout减少过拟合。
- 实施了局部响应归一化(LRN),虽然后来的研究表明LRN并不总是有益的。
- 使用多GPU训练,由于当时的GPU内存限制。
- 层数:较浅,5个卷积层和3个全连接层。
- 影响:AlexNet在2012年的ImageNet挑战中获胜,证明了深度学习在视觉任务中的潜力。
Vgg
- 年份:2014年
- 特点:
- 强调了使用更小的(3x3)卷积核堆叠的重要性。
- 展示了通过增加网络深度可以提升性能。
- 网络架构非常规整,主要由重复的3x3卷积和2x2最大池化层组成。
- 层数:较深,有VGG16和VGG19两个版本,分别含有16和19层。
- 影响:VGG简化了网络结构的复杂度,并在多个视觉任务中取得了很好的效果。
ResNet(残差网络)
- 年份:2015年
- 特点:
- 引入残差学习(Residual Learning)概念,通过跳跃连接解决了深度网络的退化问题。
- 允许构建非常深的网络(例如ResNet有50层、101层、152层版本)而不会出现梯度消失/爆炸问题。
- 性能随网络深度的增加而增加。
- 减少了训练深度网络的难度。
- 层数:非常深,从34层扩展到超过1000层。
- 影响:ResNet在多个基准测试中取得了先进的结果,成为了很多现代网络架构的基础。
以下是ResNet的一些关键原理和特点:
残差学习(Residual Learning)
在传统的神经网络中,每一层都直接学习期望的输出。ResNet则改变了这一策略,通过学习输入与输出之间的残差(即差异)来简化学习过程。具体来说,如果我们的目标是学习某个映射 H(x),ResNet将网络层设计成学习残差映射 F(x) = H(x) - x。理论上,学习残差比直接学习未映射函数更简单。
跳跃连接(Skip Connections)
ResNet通过引入所谓的“跳跃连接”(也称为快捷连接或恒等连接)来实现残差学习。在跳跃连接中,输入不仅传递到下一层,还直接添加到更深层的输出上。这种连接方式允许网络在训练过程中有效地传播梯度,从而缓解梯度消失的问题,同时也提高了网络的学习能力。
深度网络
ResNet使得构建非常深的神经网络成为可能。传统的深度网络随着层数的增加,性能越来越差。但在ResNet中,即使是几十层到上百层的网络,也能通过残差学习有效地训练。
强化特征传播
跳跃连接强化了前向传播和反向传播的过程。在前向传播过程中,它允许原始的输入信息直接传到后面的层;在反向传播时,梯度可以直接流回到前面的层,从而提高整个网络的训练效率和稳定性。
由于这些特性,ResNet在图像识别、分类等领域取得了显著的成果,可以有效地训练非常深的网络模型而不会导致性能显著下降。ResNet架构的出现,对深度学习领域的发展产生了重大影响。
前置概念
步长
步长是卷积滤波器在输入特征图上移动的距离。每次应用卷积核后,滤波器会根据步长值移动相应的像素数来开始下一次操作。
- 步长为1:滤波器每次移动一个像素。
- 步长大于1:滤波器跳过中间的像素,这会导致输出特征图的尺寸小于输入尺寸。
步长 S 影响了输出特征图的尺寸和感受野的覆盖范围。感受野是指输出特征图中每个元素对应的输入图像上的区域大小。步长决定了感受野滑动过输入图像时的快慢。
如果步长大于1,输出特征图的空间维度会比输入图像小。如果步长为1且使用了适当的填充,那么输入和输出的空间维度可以保持不变
填充
填充是在输入数据的边缘添加额外的、通常是零值的像素来增加输入数据的尺寸的过程。这样做的目的有两个:
-
保持尺寸:无填充的卷积通常会减小特征图的空间维度,填充允许我们控制特征图的大小,可以保持尺寸不变或根据需要调整尺寸。
-
边缘信息:在不使用填充的情况下,卷积操作会导致图像边缘的信息比中心部分的信息使用得更少,因为边缘像素在滤波器窗口中出现的次数少于中心像素。填充确保边缘像素也被充分利用。
填充的大小 P 指的是在每个边缘添加的像素行(或列)的数量。
感受野
概念介绍
这张图说明了在卷积神经网络(CNN)中感受野的概念。感受野指的是输入图像中影响卷积层输出的区域大小。
在这个特定的例子中,有两个卷积操作:
-
第一次卷积(First Conv):使用了3x3的卷积核,这意味着每个卷积操作的输出都是由输入特征图上3x3的区域计算得到的。因此,第一层卷积的直接感受野是3x3。
-
第二次卷积(Second Conv):这一层也使用3x3的卷积核。由于它是在第一次卷积的输出上进行的,它的感受野不仅仅局限于其直接输入的3x3区域。由于第一层的每个3x3的输出已经包含了原始输入的一个3x3的区域,第二层的3x3卷积核将覆盖更大的原始输入区域。具体来说,它会覆盖5x5的原始输入区域(因为中心像素的相邻像素在原始输入中已经包含了周围的两个像素)。
在图中红色虚线表示第二层卷积操作的感受野扩展到了更大的输入区域。这是因为第二层的输出依赖于第一层的输出,而第一层的每个输出又依赖于输入的一个3x3区域。
所以,随着通过网络层的深入,每个卷积层的输出所对应的输入图像上的感受野是逐渐扩大的。这就是为什么深层的网络能够捕捉到输入数据中更大范围的特征。
图中的注释指出,如果使用3x3的卷积核进行两次卷积,最终得到的感受野是7x7,这是因为第一次卷积的3x3感受野在第二次卷积后向外扩展了两个像素的距离(对每个方向)。这样两层3x3卷积的组合就能覆盖7x7的输入区域,比单独一次使用更大卷积核(比如7x7)来得到相同大小感受野的方式更有效率,因为它减少了计算量并保留了更多的空间信息。
小型卷积核的堆叠替代大卷积核
使用小型卷积核的堆叠(例如多层3x3卷积核)而不是单个大型卷积核(例如7x7卷积核)有几个优势:
-
减少计算量:相比于使用一个7x7的卷积核,两个3x3的卷积核的参数数量更少。一个7x7卷积核含有49个权重,而3x3卷积核只有9个权重。两个3x3卷积核总共18个权重,参数数量减少了超过一半。这意味着网络在学习这些权重时需要的计算量更少,同时还减少了模型的存储需求。
-
增加非线性:每次卷积操作后通常会跟随一个非线性激活函数(如ReLU)。如果使用两个3x3卷积核代替一个7x7卷积核,网络将有两次非线性变换的机会而不是一次。这增加了模型的非线性能力,使得网络可以捕捉到更复杂的特征。
-
保留更多空间信息:在多个小卷积核的情况下,信息在传递过程中得到更好的保留。每层都对其输入进行一些处理,而不是让一个单一的大卷积核一次性完成所有工作。这种逐层处理有助于保留空间层次结构中的细节信息。
-
更好的感受野管理:堆叠卷积层可以逐渐扩大感受野,而不是一次性在一个大的感受野中操作。这种渐进式的方式允许网络更细致地了解每个区域,逐层构建更高层次的抽象。
这些因素共同作用使得深层卷积网络可以更有效地学习,同时保持了计算上的高效性。这就是为什么在ResNet和其他现代CNN架构中,小型卷积核的使用变得如此流行。
特征输入和滤波器相关参数计算
卷积结果特征值的计算方法
假设我们有一个输入特征图,它的大小为 7x7x3(高x宽x深度),这里的深度3代表RGB三个颜色通道。我们有一个3x3x3大小的滤波器,这意味着滤波器在每个颜色通道上都有一个3x3的权重矩阵。此外,每个滤波器都有一个偏置值。
在卷积操作中,我们会进行以下步骤来计算输出特征图中一个位置的特征值:
-
对应元素相乘:我们将滤波器的每个权重与输入特征图对应位置的值相乘。
-
求和:将上一步中所有乘积的结果相加得到一个总和。
-
加上偏置:将上一步的总和加上滤波器的偏置值。
-
激活函数:通常,我们还会通过一个激活函数(如ReLU)来处理上一步的结果
如果我们计算R通道的特征值,假设输入特征图的R通道和滤波器的R通道权重如下:
输入特征图R通道的一个3x3区域:
0 0 0
0 1 1
0 1 1
滤波器R通道权重:
1 -1 0
1 0 -1
1 1 -1
我们将这两个3x3矩阵中对应位置的元素相乘,然后将结果相加:
(0*1 + 0*(-1) + 0*0) + (0*1 + 1*0 + 1*(-1)) + (0*1 + 1*1 + 1*(-1)) = 0 + (-1) + 1 = 0
这样我们就得到了R通道的特征值。同样的操作也会应用于G和B通道,并将得到的特征值相加,然后加上偏置值得到最终的特征值。如果G通道计算结果是2,B通道是0,偏置是1,则最终特征值为:
R通道结果 + G通道结果 + B通道结果 + 偏置 = 0 + 2 + 0 + 1 = 3
卷积结果长和宽的计算公式
图片中的示例说明了如何使用这些公式来计算输出特征图的尺寸。
- 一个输入特征图大小为 7x7x3(H1 = 7, W1 = 7)。
- 滤波器(卷积核)大小为 3x3(FH = 3, FW = 3)。
- 假设填充为1(P = 1),步长为1(S = 1)。
那么,我们可以计算输出特征图的每个维度:
所以,输出特征图的尺寸将会是 7x7x3,其中3是输出特征图的通道数,每个卷积核产生一个通道的输出。
最终的输出尺寸与输入尺寸相同是由于选择了适当的填充(1)和步长(1),这种设计通常用于确保特征图的空间维度在卷积操作后保持不变,这在某些网络设计中是需要的。
滤波器权重计算
- 输入特征图的深度决定了每个滤波器的深度。例如,对于彩色图像,输入特征图的深度通常是3,对应于RGB三个颜色通道。每个滤波器在这种情况下也将有3个通道,使其能够应用于输入特征图的所有通道
- 滤波器的个数,也就是卷积层中滤波器(卷积核)的数量,决定了卷积层输出特征图的深度。
如果每个滤波器的大小是 3x3x3,那么每个滤波器的权重数量是:3×3×3=27 。如果我们有三个这样的滤波器,那么总权重数量就是:3×27= 81。每个滤波器还有一个偏置参数,因此两个滤波器的总偏置数量是3,所以这个卷积层的总参数数量是权重和偏置的和:
81权重+3 偏置= 84
卷积参数共享
在传统的全连接层中,每个输入单元与每个输出单元都有一个唯一的权重,这意味着参数的数量会随着输入数据的大小迅速增加。相比之下,卷积层通过参数共享大大减少了模型的参数数量。
一个卷积核(或滤波器)的权重在整个输入特征图上滑动并应用,这意味着同一卷积核的权重在每个位置都是相同的。因此,无论输入特征图有多大,该卷积核的权重数量保持不变。
引用资料
【导师不教我来教!】基于Pytorch框架的鸢尾花分类实战,IT博士手把手带你跑通鸢尾花分类数据集,深度学习新手必备!---附数据集_哔哩哔哩_bilibili