
深度学习——分类任务基础原理 及 卷积 基础原理
Padding 指的是在进行卷积操作之前,在输入数据(如图片、特征图)的边界周围添加额外元素的过程。这些额外元素可以是零(零填充,Zero-padding),也可以是其他特定的值,具体取决于使用的填充策略。
一、初始特征图(原始图片)
初始特征图实际上就是原始的输入图片,图片上每个位置的数字代表像素值。对于彩色图片,一般采用 RGB 色彩模式,对应三个颜色通道(红、绿、蓝),因此图片维度通常表示为 高度×宽度×3
,如 224×224×3
。每个通道中像素值的大小反映了该颜色在对应位置的强度,取值范围通常是 0 - 255 (8 位图像) ,这些像素值是由图像采集设备(如相机)根据实际场景的光线和颜色信息记录下来的,并非随机赋予。
比如:
二、卷积核与权重
卷积核是卷积神经网络中用于特征提取的核心组件,卷积核上的数字就是需要学习的权重 w 。在训练开始之前,这些权重通常会采用随机初始化的方式进行赋值,常见的初始化方法有高斯分布初始化、Xavier 初始化、He 初始化等。随机初始化的目的是打破网络的对称性,让不同的卷积核能够学习到不同的特征。
比如:
三、简述训练过程:
(没看懂别慌,后边细讲)
没文化版本:
拿到一个图片比方说我们想判断是鸟还是狗猫猪,我们先定义自己的模型呗,定义模型就包括要定义卷积核啊多少层啊池化啊等等,卷积核上的数字就是权重w也就是我们要更新的参数,先“卷卷卷”把图片卷小了以后“拉直”,剩下这就和线性回归一样道理了,拉直以后的很多维的数据就是我们的输入x咯,然后就开始神经网络算算算,输出一个像独热编码一样的,比如你给了四个类别是猫狗鸟猪,就会对应四个维度,看哪个维度的数字最大就是预测的类别,当然我们还是会有loss函数根据标签y然后不断训练更新参数完善模型,之后就能用啦!!!
有文化版本:
训练卷积神经网络时,需要使用一群带有标签的图片数据集。以鸟类识别任务为例,数据集中的每张图片会被标记为 “有鸟” 或 “无鸟” 。整个训练流程如下:
- 前向传播:将输入图片传入卷积神经网络,图片依次经过各个卷积层、池化层和全连接层等。在卷积层,卷积核在输入图片上滑动进行卷积操作,将卷积核的权重 w 与对应位置的像素值相乘并求和,得到特征图。这些特征图会继续传递到后续层进行处理,最终通过全连接层输出一个预测结果,该结果表示图片属于各个类别的概率。
- 损失计算:将网络的预测结果与图片的真实标签进行对比,使用损失函数(如交叉熵损失)计算损失值。损失值反映了预测结果与真实标签之间的差异,我们的目标是通过调整网络的权重来最小化这个损失值。
- 反向传播:从损失函数开始,利用链式法则逐层计算损失关于各层参数(包括卷积核的权重 w )的梯度。这些梯度表示了损失函数随权重 w 变化的速率,告诉我们如何调整权重才能使损失值减小。
- 权重更新:根据计算得到的梯度,使用优化算法(如随机梯度下降、Adam 等)更新卷积核的权重 w 。每次更新后,卷积核就会更倾向于提取对准确分类有帮助的特征。
- 迭代训练:重复上述步骤,对数据集中的所有图片进行多次迭代训练。随着训练的进行,卷积核的权重会不断调整和优化,逐渐学会从输入图片中提取出有意义的特征,从而提高网络的识别能力。
四、“深述"训练过程:
(1)卷积卷的过程
卷积核首先是在特征图上滑动的,比如这个图呢,就是现在是定义了两个卷积核都是3*3*3的
然后呢,有一个3*6*6的一个初始特征图,我们这两个卷积分别在上面一行一行滑动
先定位到特征图重的某一个3*3*3的区域,将卷积核的权值与对应位置的相乘之后所有都进行相加得到一个输出值,
之后滑动到下一个3*3*3的区域,然后如上
...
我们如此重复会把所有的3*3*3的区域全部卷完,之后呢
所有的输出值拼起来,得到一个1*4*4的新的特征图
但是!!我们这里是有两个卷积核的,每一个卷积核得到一个1*4*4的新的特征图,俩个拼到一起就可以得到一个channel = 2的特征图即2*4*4
这个时候我们要进行下一级的卷积时候,我们新的卷积核channel数必须和特征图的channel数是相等的
就比方说这个特征图是5个channel的,中间的卷积核也是5个channel的,最后一个卷积核对应出来一张特征图,叠一起又是一个新的特征图,
再继续...
A.!!!输出特征图尺寸公式 !!!
P就是padding的值,如下
B.原始特征图、新特征图和卷积核深度的关系
在卷积操作中,卷积核的深度(通道数)必须和原始特征图的通道数相等。这是因为卷积核需要在原始特征图的每个通道上进行操作,对应通道的元素依次相乘后再求和。
一个卷积核经过卷积操作后会生成一个通道的新特征图。如果使用 n 个卷积核同时对原始特征图进行卷积,就会得到一个包含 n 个通道的新特征图
所以显而易见,卷积操作中,如果不进行填充,随着卷积核的滑动,输出特征图的尺寸通常会小于输入特征图的尺寸,那我们可以怎么处理让输出的特征图的大小不变呢?
引入
C.padding
Padding(填充)是卷积神经网络(CNN)中一个重要的概念,用于在卷积操作中对输入数据进行处理。下面从定义、类型、作用、计算方式和代码实现几个方面进行详细介绍。
定义
Padding 指的是在进行卷积操作之前,在输入数据(如图片、特征图)的边界周围添加额外元素的过程。这些额外元素可以是零(零填充,Zero-padding),也可以是其他特定的值,具体取决于使用的填充策略。
类型
1. 零填充(Zero-padding)
定义
Zero-padding 指的是在输入数据(如图像特征图)的边界周围填充零值。例如,对于一个二维的图像特征图,会在其上下左右四个方向填充一定数量的零行或零列;对于三维的特征图(包含通道维度),则是在高度和宽度方向的边界填充零。
作用
- 保持特征图尺寸:在卷积操作中,如果不进行填充,随着卷积核的滑动,输出特征图的尺寸通常会小于输入特征图的尺寸。通过使用 Zero-padding,可以使输出特征图的尺寸与输入特征图的尺寸相同或接近。例如,当使用 \(3\times3\) 的卷积核,步长为 1 时,采用适当的 Zero-padding 可以保证输出特征图和输入特征图具有相同的高度和宽度。
- 保留边界信息:卷积核在处理输入数据时,边界区域的像素被卷积的次数相对较少,可能会导致边界信息的丢失。通过 Zero-padding,可以让边界像素也能被充分卷积,从而保留更多的边界信息,有助于模型学习到更完整的特征。
- 控制感受野:填充可以影响卷积核的感受野,即神经元在输入数据上感知信息的范围。合适的填充可以调整感受野的大小,使得模型能够更好地捕捉不同尺度的特征。
填充方式
常见的填充方式有两种:
- Same Padding:填充的目的是使输出特征图的尺寸与输入特征图的尺寸相同。对于一个大小为 \(K\times K\) 的卷积核,当步长为 1 时,需要在输入特征图的上下左右各填充 \(\frac{K - 1}{2}\) 行 / 列零(前提是 K 为奇数)。
- Valid Padding:不进行填充,卷积核只在输入数据的有效区域内进行滑动,输出特征图的尺寸会小于输入特征图的尺寸。
2. 边界填充(Boundary-padding)
边界填充是将输入数据的边界值复制到填充区域。比如,对于图像的边缘像素,将其值复制到填充的位置。这种填充方式可以保留输入数据的边界信息,避免因零填充引入的不连续性。
3. 反射填充(Reflection-padding)
反射填充是将输入数据以边界为轴进行反射,将反射后的值填充到边界周围。与边界填充相比,反射填充能更好地保持数据的局部结构。
D.来点小练习
这里卷积核大小为2,就是意思是2*2
过程很好理解,就和我前面说的一样,理解了过程套公式也很容易得到
E.特征图怎么变小
我们最终是要特征图越来越小,参数要会少很多,很多然后最后拉直的
方法1:扩大步长
原理
步长指的是卷积核在输入特征图上每次滑动的间隔距离。在常规卷积操作中,步长默认为 1,也就是卷积核每次在输入特征图上按顺序移动一个像素位置。当把步长扩大,例如设置为 2 时,卷积核每次就会跳过一个像素进行滑动,这使得卷积核覆盖输入特征图的范围减少,进而导致输出的特征图尺寸变小。
优点
- 减少计算量:特征图尺寸变小意味着需要处理的数据量减少,这样在后续的计算过程中,无论是卷积操作还是其他运算,所需的计算资源和时间都会相应减少,能提高模型的训练和推理速度。
- 扩大感受野:更大的步长使得卷积核能够在输入特征图上更快地覆盖更大的区域,相当于扩大了卷积核的感受野,有助于模型捕捉更宏观的特征信息。
为什么扩大步长就增大视野了?
感受野的定义
感受野(Receptive Field)指的是卷积神经网络中某一层输出特征图上的一个像素点,在原始输入图像上所对应的区域大小。简单来说,就是该像素点能够 “看到” 的原始输入图像的范围。感受野越大,意味着该像素点包含了更多原始输入图像的信息,能够捕捉到更宏观的特征。
步长对卷积操作和感受野的影响
常规步长(步长为 1):当步长为 1 时,卷积核在输入特征图上逐个像素地滑动进行卷积操作。每一个输出特征图上的像素点是由卷积核在输入特征图上的一个小区域进行卷积得到的,这个小区域就是该输出像素点的感受野。随着网络层数的增加,感受野会逐渐增大,但增大的速度相对较慢。
扩大步长:当步长增大时,卷积核在输入特征图上跳跃式地滑动。例如,步长为 2 时,卷积核每次跳过一个像素进行滑动。这样,在相同的卷积核大小和网络层数下,输出特征图上的一个像素点所对应的原始输入图像的区域会更大,也就是感受野增大了。因为步长的增大使得卷积核能够更快地覆盖输入特征图像素点能够整合更多原始输入图像的信息。的更广泛区域,从而让输出特征图上的像素点能够整合更多原始输入图像的信息。
具体示例
假设我们有一个输入图像,其大小为 \(8\times8\),使用一个 \(3\times3\) 的卷积核进行卷积操作。
步长为 1 的情况
- 对于第一层卷积,输出特征图上的一个像素点是由卷积核在输入图像上的一个 3*3 区域卷积得到的,所以该像素点的感受野就是3*3 。
- 如果进行第二层卷积,第二层输出特征图上的一个像素点对应的第一层特征图区域是 3*3 ,而第一层特征图上的每个像素点的感受野是3*3 ,那么第二层输出特征图上的一个像素点在原始输入图像上的感受野就是5*5 (可以通过逐步推导得出)。
步长为 2 的情况
- 对于第一层卷积,由于步长为 2,卷积核在输入图像上跳跃式滑动。输出特征图上的一个像素点对应的输入图像区域仍然是由3*3的卷积核卷积得到的,但由于步长的原因,这个像素点在输入图像上 “看到” 的范围更广了。实际上,第一层输出特征图上的一个像素点的感受野就相当于步长为 1 时第二层输出特征图上一个像素点的感受野,即5*5 。
缺点
- 信息丢失:步长增大后,卷积核会跳过一些像素位置,这可能会导致部分细节信息丢失,使得模型无法学习到输入特征图中的一些细微特征,对模型的性能产生一定影响。
- 特征分辨率降低:特征图尺寸变小会使特征的分辨率下降,可能会影响模型对物体的精确识别和定位能力。
方法2:依靠Pooling: 池化
在卷积神经网络(CNN)中,池化(Pooling)是一种常用的下采样操作,它可以有效减小特征图的尺寸,同时保留重要的特征信息。下面从池化的原理、常见类型、作用、优缺点以及代码实现等方面进行详细介绍。
原理
池化操作将输入特征图划分为若干个不重叠的区域(池化窗口),然后对每个区域内的元素进行某种汇总统计,得到一个代表值,以此来构建输出特征图。通过这种方式,池化操作可以在减少数据量的同时,保留输入特征图中的主要特征。
常见类型
最大池化(Max Pooling)
- 操作方式:在每个池化窗口内选取最大值作为该区域的代表值。例如,使用一个 2*2的最大池化窗口,步长为 2,会将输入特征图划分为多个2*2区域,然后取每个区域内的最大值作为输出特征图对应位置的值。
- 特点:最大池化能够突出输入特征图中的显著特征,因为它只保留了每个区域内的最大值,有助于提取图像中的边缘、角点等重要特征。
平均池化(Average Pooling)
- 操作方式:计算每个池化窗口内所有元素的平均值作为该区域的代表值。同样以 2*2的平均池化窗口,步长为 2 为例,会对每个2*2 区域内的元素求平均值,并将结果作为输出特征图对应位置的值。
- 特点:平均池化会考虑池化窗口内的所有元素,相对比较平滑,能够保留更多的背景信息,但可能会丢失一些细节特征。
作用
减小特征图尺寸
池化操作可以显著减小特征图的高度和宽度,从而减少后续计算的复杂度和模型的参数数量。例如,使用 \(2\times2\) 的池化窗口,步长为 2,会使特征图的尺寸减半,计算量和参数数量也会相应减少。
增加模型的鲁棒性
通过对局部区域进行汇总统计,池化操作可以在一定程度上对输入特征图的小变化具有不变性。例如,图像中的物体发生了轻微的平移或旋转,经过池化后,输出特征图可能不会发生太大的变化,从而增加了模型的鲁棒性。
扩大感受野
与扩大步长类似,池化操作也可以扩大模型的感受野。随着池化层的增加,输出特征图上的一个像素点能够 “看到” 的原始输入图像的范围会逐渐增大,有助于模型捕捉更宏观的特征信息。
优缺点:
优点
- 降低计算复杂度:减少了特征图的尺寸,从而降低了后续卷积层或全连接层的计算量,加快了模型的训练和推理速度。
- 防止过拟合:减少了模型的参数数量,有助于防止模型过拟合,提高模型的泛化能力。
- 增强特征的稳定性:对输入特征图的小变化具有一定的不变性,使模型更加稳定。
缺点
- 信息丢失:池化操作会丢失一些细节信息,因为它只保留了每个池化窗口内的汇总统计值,可能会导致一些有用的信息被忽略。
- 特征分辨率降低:特征图尺寸的减小会导致特征的分辨率降低,可能会影响模型对物体的精确识别和定位能力。
(2)怎么卷出来一个类别呢?
说了这么多,我们怎么判断这个图片是鸟还是猪呢
我们不是经过好几层的卷积池化得到了一个较小的特征图嘛,然后呢,就可以拉直拉长
成了一个长条向量,我们就可以看做是输入数据X咯,之后就和线性回归一样,构建模型
全连接啊啥的,然后之后呢,输出y^呢?
也是一个向量,就和独热编码一样,我们看哪个数值最大,它就对应的是哪个类别
但这些也只是实数,我们想要的是概率吧,那样更直观
就要引入Softmax 函数
Softmax 函数
Softmax 函数是机器学习,尤其是深度学习中非常重要的一个函数,常用于多分类问题。
定义
Softmax 函数是一种将多个任意实数转换为对应概率分布的函数。在多分类问题中,模型的输出通常是多个类别的得分,这些得分是任意实数,没有明确的概率意义。Softmax 函数的作用就是将这些得分转换为每个类别对应的概率,使得所有类别的概率之和为 1,从而方便我们进行类别预测。
公式
假设模型的输出是一个包含 n 个元素的向量,其中 Zi表示第 i 个类别的得分。那么经过 Softmax 函数处理后,第 i 个类别的概率Pi 计算公式如下:
其中 e 是自然常数(约等于 2.71828)。
作用
- 概率解释:将模型的原始输出转换为概率分布,使得我们可以直观地了解每个类别被预测的可能性大小。例如,在图像分类任务中,Softmax 输出的概率可以告诉我们图像属于每个类别的概率分别是多少。
- 多分类决策:由于 Softmax 输出的概率之和为 1,我们可以选择概率最大的类别作为最终的预测结果。这使得模型在多分类问题中能够做出明确的决策。
- 与交叉熵损失函数配合:在训练过程中,Softmax 函数通常与交叉熵损失函数一起使用。交叉熵损失函数可以衡量模型预测的概率分布与真实标签的概率分布之间的差异,通过最小化交叉熵损失,可以使模型的预测结果更接近真实标签。
Softmax 并不是简单地将数值转换为百分比。简单的百分比计算是将每个数值除以所有数值的总和,而 Softmax 函数使用指数函数对输入进行变换,再进行归一化处理。
softmax 不等于 简单百分比计算
对于输入 y = torch.tensor([11.7, 23, 20], dtype=torch.float64)
,如果按简单的百分比计算,是将每个元素除以所有元素的总和。以下是使用 Python 和 PyTorch 实现的代码:
import torch
y = torch.tensor([11.7, 23, 20], dtype=torch.float64)
percentages = y / y.sum()
print(percentages)
运行上述代码,输出结果会是每个元素在总和中所占的比例,这和 Softmax 函数的计算方式不同。
Softmax 计算
下面是使用 PyTorch 对输入 y = torch.tensor([11.7, 23, 20], dtype=torch.float64)
进行 Softmax 计算的代码
import torch
import torch.nn.functional as F
y = torch.tensor([11.7, 23, 20], dtype=torch.float64)
softmax_output = F.softmax(y, dim=0)
print(softmax_output)
在这个计算过程中,使用了指数函数对输入进行变换,其目的是放大输入中数值较大的元素,缩小数值较小的元素,使得输出的概率分布更加 “尖锐”,突出数值较大元素对应的概率。这和简单的百分比计算有本质区别,简单百分比计算只是线性地反映各元素在总和中的占比,而 Softmax 计算引入了指数变换,能够更好地体现元素之间的相对大小关系。
综上所述,tensor([1.1786e-05, 9.5256e-01, 4.7425e-02], dtype=torch.float64)
是输入 [11.7, 23, 20]
经过 Softmax 函数计算得到的结果,而不是简单百分比计算的结果。
(3)分类任务的LOSS
交叉熵损失
交叉熵损失(Cross-Entropy Loss)是深度学习中常用的损失函数,尤其在分类问题里应用广泛。
定义
交叉熵是信息论中的一个概念,它用于衡量两个概率分布之间的差异程度。在机器学习的分类任务中,一个概率分布是模型预测得到的类别概率分布,另一个则是真实标签所对应的概率分布。交叉熵损失就是通过计算这两个概率分布的交叉熵来衡量模型预测结果与真实标签之间的差异,训练的目标是让这个损失值尽可能小。
公式
二分类问题
多分类问题
原理
交叉熵损失的原理基于信息论中的熵和相对熵(KL 散度)概念。熵用于衡量一个概率分布的不确定性,而相对熵则用于衡量两个概率分布之间的差异。交叉熵损失本质上是真实标签分布的熵与真实标签分布和预测分布之间的相对熵之和。当模型预测的概率分布与真实标签的概率分布完全相同时,交叉熵损失达到最小值 0;两者差异越大,交叉熵损失就越大。
作用
- 衡量模型性能:通过计算交叉熵损失,可以直观地了解模型在当前训练阶段的预测结果与真实标签之间的差异程度,损失值越小,说明模型的性能越好。
- 指导模型训练:在训练过程中,使用优化算法(如随机梯度下降、Adam 等)来最小化交叉熵损失。通过不断调整模型的参数,使得模型预测的概率分布逐渐接近真实标签的概率分布,从而提高模型的分类准确率。
(4)梯度回传和梯度下降
还是我们的老朋友了,计算梯度之后×学习率再减去,就这么个事,然后epoch一轮轮训练,最后会有好效果
引入一些大模型说的专业一下
1. 前向传播与交叉熵损失计算
2. 梯度回传(反向传播)
计算得到损失值后,需要通过反向传播算法来计算损失函数关于模型中各个参数(如卷积核的权重、全连接层的权重等)的梯度。反向传播基于链式法则,从损失函数开始,逐层向前计算梯度。
具体来说,对于神经网络中的每一层,都会计算该层参数对损失函数的偏导数。例如,对于一个简单的两层神经网络,包含输入层、隐藏层和输出层,在反向传播时,会先计算输出层的权重对损失函数的梯度,然后根据链式法则,将这些梯度传递到隐藏层,计算隐藏层的权重对损失函数的梯度。
梯度表示了损失函数随参数变化的速率和方向。通过反向传播,我们可以知道每个参数对损失函数的影响程度,为后续的参数更新提供依据。
3. 梯度下降更新模型参数
五、卷积和全连接的关系
卷积: 一种参数共享的“不全连接”,
如图,都flatten拉直,很明显不是全连接,没有上一层和下一层都相连
其次,我们注意到不是每根"线"都有自己的w,而是都共用四个w(w1w2w3w4)
所以求梯度,梯度回传,梯度下降都是一样的道理哈
关于bias
单通道情况
如果是单通道输入,一个卷积核确实对应一个偏置 b。卷积核在特征图上滑动,与特征图中对应卷积核大小的块进行元素相乘后再相加,得到一个值,然后加上对应的这个偏置 b, 该结果就作为输出特征图中的一个点的值。
多通道情况
对于多通道输入,一个卷积核的通道数会与输入特征图的通道数相同,卷积时,卷积核在每个通道上与对应通道的特征图块做乘法求和,再把各通道结果相加,得到一个初步值,然后再加上这个卷积核对应的唯一的偏置 b,作为输出特征图中的一个点。而且,当有多个卷积核时,每个卷积核都有其独立对应的偏置 b ,它们分别进行上述运算,共同生成输出特征图
六、特征提取器,分类头,提取的特征
- 特征提取器:在 flatten 之前的卷积层、池化层(图中虽未明确画出池化层,但通常特征提取模块会包含它)等组成特征提取器,用于从输入图像中提取各种层次的特征信息,形成特征图。
- 提取的特征:即latten 后的向量:对卷积等操作得到的特征图进行 flatten(展平)处理,将多维的特征图转换为一维向量,这个一维向量包含了从图像中提取出的特征信息。
- 分类头:图中的全连接层(Linear 层)就是分类头的一部分,它接收 flatten 后的特征向量,通过权重计算将其映射到不同类别上,输出每个类别的预测得分,进而判断图像所属类别 。
七、经典数据集合
知识补充一下:没有特殊需要的话,了解即可,简述一下
MNIST 数据集、CIFAR10、IMAGENET、COCO 数据集都是全球通用的开源经典图像数据集,
- MNIST 数据集
- 介绍:由手写数字的图像组成,有 6 万张训练图像和 1 万张测试图像,图像为 28×28 像素的灰度图,用于图像识别入门。
- 用途:常作为初学者学习神经网络等算法的入门数据集,用于简单图像识别模型训练,快速验证模型在简单图像任务上的性能,探索基本算法和神经网络结构。
- Cifar10 数据集
- 介绍:含有 10 个类别的 6 万张彩色图像,图像尺寸为 32×32 像素,在图像分类领域应用广泛。
- 用途:用于训练中等规模图像分类模型,评估图像分类算法性能,研究提高模型对小尺寸图像的特征提取和泛化能力。
- IMAGENET 数据集
- 介绍:拥有超过 1400 万张图像,涵盖 1000 多个类别,是大规模的图像数据集。
- 用途:用于训练大规模深度神经网络,是图像识别领域权威性的评估数据集,推动图像识别等领域算法研究和技术创新。
- COCO 数据集
- 介绍:包含自然场景中的图像,有丰富的标注信息,如目标检测、实例分割、语义分割等标注。
- 用途:用于训练目标检测、实例分割、语义分割等多任务模型,评估模型在复杂场景下对不同物体的检测和分割能力,推动多任务学习算法研究和技术创新。
这四个经典数据集主要是用来测试和训练模型的
这只是原理讲解
后续慢慢更新一些当今的大模型讲解
还有分类项目实战
如有错误,请评论指出交流
一起学习一起进步!!!^_^
By the way:支持李哥,我的老师,和他学到了很多
打个广告:嘻嘻,这课程真的物超所值,支持支持支持
更多推荐
所有评论(0)