【机器学习】卷积神经网络(CNN)
卷积神经网络(CNN)是一种深度学习模型,通过多层结构实现图像识别等任务。CNN包括输入层、卷积层、池化层、全连接层和输出层。输入层接收原始数据,卷积层通过滑动卷积核提取图像特征,池化层进一步压缩特征图,减少过拟合并提高模型对平移等变换的鲁棒性。全连接层将提取的特征展开并进行分类或回归任务,输出层通过Softmax函数生成概率分布,完成最终预测。CNN广泛用于图像处理、手写数字识别等领域,具有很强
卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习模型,广泛应用于图像识别、目标检测、自然语言处理等任务。它通过模拟生物视觉系统的机制,能够自动提取图像中的局部特征并逐层进行复杂特征的组合。CNN与传统的神经网络不同,主要有5种重要的层结构:输入层、卷积层、池化层、全连接层、输出层。
下面按照输入层、卷积层、池化层、全连接层、输出层的顺序详细介绍卷积神经网络(CNN)的工作原理:
1. 输入层
输入层是卷积神经网络的起点,接受原始数据作为输入。
对于图像处理任务,输入层通常是一张图片,具体表现为一个多维矩阵。例如,一张28x28的灰度图像可以表示为一个28x28的二维矩阵,每个元素代表一个像素点的灰度值。如果是彩色图像,它会有三个通道(RGB),即输入的数据会是一个28x28x3
的三维矩阵。
示例:
2. 卷积层
当图片输入到卷积神经网络(CNN)后,卷积操作通过识别图像中的局部特征来确定某一区域是否包含特定特征。具体而言,卷积操作会为存在特征的区域生成较高的值,而为不包含特征的区域生成较低的值。这个过程是通过输入图像与卷积核(Convolution Kernel)的点积计算完成的。
例如,假设输入的图片是一张人脸,而我们希望提取的特征是眼睛。我们可以使用一个以“眼睛”为形状的卷积核,并将其在整张人脸的图像上滑动。每滑动一次,都会计算图像局部区域与卷积核的点积结果。这个过程如图所示:
通过这个卷积过程,生成了一个新的二维矩阵,该矩阵被称为特征图(Feature Map)。
卷积核本质上是一个小于或等于输入图像大小的二维矩阵。在卷积过程中,卷积核通过滑动窗口的方式逐步在输入图像上移动。每次移动时,都会计算卷积核与图像局部区域的点积,并将该结果作为特征图中对应位置的值。这个过程如下图所示:
可以看到,整个过程类似于降维操作,通过卷积核的逐步滑动和计算,图像中最有用的特征被提取出来。我们通常将通过卷积核计算得到的新的二维矩阵称为特征图。(注意:有几个卷积核最终就会得到几个特征图)
有些读者可能会注意到,每次卷积核移动时,图像中心的区域会被多次计算,而图像的边缘区域则只被计算一次。这可能会导致边缘特征的丢失,进而影响特征提取的准确性。
为了解决这一问题,我们可以在输入图像的四周添加一圈或多圈的像素,使得边缘区域也能被多次计算到。这种在图像外围添加额外像素以防止特征丢失的技术称为填充(Padding),具体示例如下:
通过这种方式,图像的每一个位置都能被公平地计算,从而避免了边缘特征的丢失,确保特征提取的完整性。
3. 池化层
在卷积神经网络中,我们提到过,每个卷积核会生成一张特征图,而卷积核的数量直接决定了特征图的数量。在现实应用中,通常使用大量卷积核,这意味着我们会生成大量特征图,并提取出许多特征。然而,事实上,许多特征可能是冗余或不必要的,这会带来以下两个主要问题:
- 过拟合:模型可能会过度拟合训练数据的噪声和细节,影响泛化能力。
- 维度过高:高维数据会增加计算复杂度,同时增加模型训练的难度。
为了有效解决这些问题,通常会引入池化层。池化层又称为下采样层,用于在卷积操作后提取特征图中最具代表性的特征,帮助减少不必要的特征,从而减小过拟合的风险和降低数据的维度。
(1) 常见的池化操作
- 最大池化(Max Pooling):在每个局部区域(如2x2)中,选择最大值作为该区域的代表,这样可以保留图像中最显著的特征。
- 平均池化(Average Pooling):在每个局部区域中取平均值,以平滑特征图的值。
池化操作有几个关键参数:
- kernel_size = 2:池化过程使用的区域大小为2x2。如果是卷积操作中的卷积核,大小同样为2x2。
- stride = 2:池化时,窗口每次移动的步长为2,即窗口每次移动两个位置,类似于卷积操作的滑动过程。
- padding = 0:无填充,意味着没有对输入特征图的边缘进行扩展。
(2) 池化层的目的
通过池化层,我们可以减小特征图的尺寸,在保留重要特征的同时降低模型的复杂度,从而避免过拟合。
(3) 池化层的优点
- 减少参数量:在降低计算复杂度的同时保留图像的关键特征。
- 防止过拟合:通过简化特征图,减少模型对噪声和无关特征的依赖。
- 增强平移不变性:池化操作可以使模型对输入图像的微小平移或变化更具鲁棒性。
平移不变性
平移不变性指的是当输入数据发生平移(即位置上的变化)时,模型的输出保持相对稳定或不受影响。在卷积神经网络(CNN)中,平移不变性非常重要,尤其在处理图像时,因为图像中的物体可能出现在不同位置,但模型仍然需要正确识别出这些物体。
如图所示,如果一张图像中的物体从图像的中央移动到边缘,具有平移不变性的模型应该能够依然正确识别该物体,而不受其位置变化的影响。
CNN中的池化层(尤其是最大池化)通过在较小区域内提取最显著的特征,使得模型在面对图像的局部平移时仍能保留关键特征,从而帮助模型实现平移不变性。这使得CNN对图像中的小的平移、旋转和缩放变化更加鲁棒。
4. 全连接层
在卷积层和池化层提取了局部特征之后,进入全连接层。全连接层是神经网络中的标准层,即在现代的深度学习模型(如卷积神经网络、循环神经网络等)中,全连接层仍然被用作处理从特征提取层(如卷积层)传递来的高维特征,最终生成具体的输出。特别是在分类任务中,全连接层通常作为最后几层,整合特征并完成最终的预测。
所有神经元与前一层的所有神经元相连。它将池化层输出的特征向量进行处理,将图像的特征整合为更高层次的特征表示,最终用于分类或回归等任务。
(1) 神经元
在神经网络中,神经元(也称为节点或单元)是网络中的基本计算单位,类似于生物神经元。每个神经元的主要作用是接受输入信息,进行处理,然后将结果传递给下一层的神经元。这个过程类似于大脑中神经元接收信号、处理信息并发出反应的过程。一个神经元通常有以下几个重要组成部分:
-
输入(Inputs):神经元会接收来自前一层的输入信号。输入信号通常是从其他神经元的输出或者原始输入数据中获取的。每个输入信号都会被赋予一个权重值。输入可以表示为一个一维向量
[x1, x2, ..., xn]
,每个输入信号xi
表示的是来自前一层的一个数据点。 -
权重(Weights):每个输入信号都有对应的权重,权重决定了该输入信号对最终输出的影响程度。权重是神经网络学习的关键参数,通过训练过程,神经网络会不断调整这些权重,以便更好地拟合数据。如果输入信号是
[x1, x2, ..., xn]
,那么每个输入信号对应的权重是[w1, w2, ..., wn]
。 -
加权求和:神经元会将输入信号与对应的权重相乘,并将这些乘积求和。这个过程可以表示为:
z = w1 * x1 + w2 * x2 + ... + wn * xn + b
其中
b
是一个偏置项,它允许神经元输出在没有输入信号时也能产生一个非零的值,这帮助模型更灵活地拟合数据。 -
激活函数(Activation Function):加权求和的结果
z
会被传递到一个激活函数。激活函数的作用是引入非线性,使神经网络能够处理更复杂的数据模式。如果没有激活函数,神经网络的输出只是线性组合,无法表示复杂的决策边界。常用的激活函数包括:
- ReLU(Rectified Linear Unit):定义为
ReLU(x) = max(0, x)
,它将负值部分变为0,只保留正值部分。 - Sigmoid:将输出值压缩到
[0, 1]
之间。 - Tanh:将输出值压缩到
[-1, 1]
之间。
- ReLU(Rectified Linear Unit):定义为
-
输出:激活函数的输出就是该神经元的最终结果。这个结果会被传递给下一层的神经元,作为下一层的输入。
示例
假设我们有一个神经元,它有两个输入信号x1
和x2
,对应的权重分别是w1
和w2
,偏置b
为常数,激活函数为ReLU。
神经元的工作流程如下:
- 输入信号:
x1 = 0.5
,x2 = -1.2
- 权重:
w1 = 0.8
,w2 = -0.5
- 偏置:
b = 0.3
计算加权求和:
z = w1 * x1 + w2 * x2 + b
= 0.8 * 0.5 + (-0.5) * (-1.2) + 0.3
= 0.4 + 0.6 + 0.3
= 1.3
激活函数(使用ReLU函数):
a = ReLU(1.3) = max(0, 1.3) = 1.3
输出值:1.3
,这个值将传递给下一层(这样就完成了从二维到一维的降维)。
神经元的作用
-
信息处理:神经元的核心任务是处理从前一层传递过来的信息,并对这些信息进行加权、求和和非线性变换。每个神经元的输出值都是对输入数据特征的某种抽象表示。
-
学习权重:通过训练,神经网络可以根据训练数据调整每个神经元的权重和偏置。通过误差反向传播算法(Backpropagation),神经元可以学习到合适的权重,使得网络整体能够更好地拟合数据。
神经元在全连接层中的角色
在全连接层中,每个神经元与前一层的所有神经元都相连接,接收前一层所有神经元的输出作为输入。全连接层的每个神经元会对这些输入进行加权求和,并输出到下一层。
假设一个全连接层有n
个神经元,而前一层有m
个神经元。每个神经元会从前一层接收m
个输入,每个输入都带有不同的权重。每个神经元的输出值是这些输入的加权和经过激活函数处理后的结果。层与层之间通过神经元的这种计算连接,逐层进行信息的处理和传递。
(2) 全连接层工作机制
- 将卷积和池化层提取的特征展开成一维向量。
- 每个神经元对输入进行加权求和,并通过激活函数输出。
- 通过多层全连接层,进一步组合和处理特征。
全连接层通过整合特征,为最终的分类或回归提供输入。
5. 输出层
输出层是CNN的最后一层,负责生成最终的预测结果。在分类任务中,输出层通常会有与类别数相同的神经元,每个神经元的输出表示该类别的预测概率。为了得到一个概率分布,通常会使用softmax激活函数,将输出值转换为概率。
Softmax激活函数
Softmax激活函数是一种用于多分类任务的激活函数,它将网络的输出值转换为概率分布。这意味着,Softmax将输出层的每个值(也叫logits)映射到一个0到1之间的值,这些值的总和为1,因此可以解释为类别的概率。
对于一个有
n
n
n个分类的模型,假设网络输出为:
z
=
[
z
1
,
z
2
,
.
.
.
,
z
n
]
z = [z_1, z_2, ..., z_n]
z=[z1,z2,...,zn]
每个
z
i
z_i
zi是模型的一个输出值(logit),softmax函数将这些logit转换为概率,其公式为:
P
(
y
i
)
=
e
z
i
∑
j
=
1
n
e
z
j
P(y_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}
P(yi)=∑j=1nezjezi
其中:
- P ( y i ) P(y_i) P(yi)表示类别 i i i的概率。
- e z i e^{z_i} ezi是logit的指数。
- ∑ j = 1 n e z j \sum_{j=1}^{n} e^{z_j} ∑j=1nezj是所有logit指数值的和,用来进行归一化。
通过这个公式,Softmax可以将每个logit值转换成概率值。因为分母是所有类别的指数和,Softmax确保所有类别的概率总和为1。
Softmax的特点
- 概率分布:Softmax输出的结果是每个类别的概率,所有概率相加等于1。
- 区分度:Softmax函数将较大的logit值转换为较大的概率,较小的logit值对应较小的概率,因此它能很好地反映哪个类别的概率最大。
手写数字识别过程举例
手写数字识别的过程可以通过卷积神经网络(CNN)的层级结构来实现,以下是对该过程的学术严谨表述,按步骤展开:
-
手写数字图像转化为像素矩阵
手写数字图像首先被输入到模型中,转换为对应的像素矩阵。对于灰度图像,该矩阵的每个元素表示图像中像素的灰度值,通常范围在0到255之间。 -
Padding卷积操作以保留边缘特征
为了保留输入图像的边缘特征,模型在执行第一次卷积运算之前对像素矩阵进行填充(Padding)。Padding的目的是在不损失图像边缘信息的情况下,保持卷积输出的尺寸与输入相同。在该步骤中,卷积核滑动遍历整个图像,对每个局部区域进行加权求和,生成一个特征图。 -
使用多个卷积核生成多通道特征图
在第一步卷积操作之后,使用多个不同的卷积核(在本例中为6个)对图像进行卷积。每个卷积核能够提取图像中的不同特征(如边缘、纹理、模式),从而生成6个特征图,这些特征图代表输入图像的多通道特征表示。 -
池化操作(下采样)缩小特征图尺寸
对生成的每个特征图执行池化操作,也称为下采样操作。常见的池化方式是最大池化(Max Pooling),它将特征图分为不重叠的区域,并从每个区域中选择最大值,从而减少特征图的尺寸。这一操作可以有效缩小数据流的大小,同时保留重要的特征信息。经过池化后,得到6个尺寸缩小的特征图。 -
第二次卷积运算生成更多特征图
在池化操作后,将每个缩小后的特征图输入到第二层卷积层中进行再次卷积。这一层卷积通常会增加卷积核的数量,从而生成更多的特征图,这些特征图进一步提取图像的高层次特征。 -
对新生成的特征图进行池化操作
对第二次卷积生成的特征图再次执行池化操作,以进一步缩小特征图的尺寸。此步骤和之前的池化操作类似,目的是减少计算复杂度的同时保留重要的特征信息。 -
全连接层的第一次连接
池化后的特征图被展平(flatten),转化为一维向量,并输入到全连接层。全连接层中的每个神经元与上一层的所有输入节点相连,通过加权求和和非线性激活函数生成输出。 -
全连接层的第二次连接
第一次全连接层的输出被进一步输入到第二次全连接层,进行更加复杂的特征组合。该层将高层次特征进一步整合,并为最终的分类决策提供基础。 -
最终输出层的概率计算
最终,第二次全连接层的输出进入输出层,输出层有10个神经元,每个神经元对应一个类别(数字0到9)。通过Softmax激活函数,将输出值转换为概率分布,每个神经元的输出表示将输入图像识别为该类别的概率。模型选择概率最大的类别作为最终的预测结果。 -
模型识别结果与手写数字的匹配
最终,输入的手写数字经过模型(如LeNet)处理后,预测结果与手写输入数字进行比较,并显示在可视化结果中。识别结果与手写数字一致,表明该模型在手写数字识别任务中表现良好。
通过以上步骤,卷积神经网络能够有效地识别手写数字,并输出类别预测结果。
更多推荐
所有评论(0)