在深度学习领域,卷积神经网络(CNN)是处理图像、视频等网格状数据的基石。本文将从最基础的图像知识开始,逐步讲解 CNN 的核心组件------卷积层和池化层,为后续实战打好坚实的理论基础。
一、图像基础知识
1.1 图像基本概念
图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。"图"是物体反射或透射光的分布,"像"是人的视觉系统所接受的图在人脑中所形成的印象或认识。在计算机中,按照颜色和灰度的多少可以将图像分为四种基本类型。
二值图像
一幅二值图像的二维矩阵仅由 0、1 两个值构成,"0"代表黑色,"1"代表白色。由于每一像素(矩阵中每一元素)取值仅有 0、1 两种可能,所以计算机中二值图像的数据类型通常为 1 个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
灰度图像
灰度图像矩阵元素的取值范围通常为 [0, 255] 。因此其数据类型一般为 8 位无符号整数(uint8) ,这就是人们经常提到的 256 灰度图像。**"0"表示纯黑色,"255"表示纯白色,中间的数字从小到大表示由黑到白的过渡色。**二值图像可以看成是灰度图像的一个特例。
索引图像
索引图像的文件结构比较复杂,除了存放图像的二维矩阵 外,还包括一个称之为颜色索引矩阵 MAP 的二维数组 。MAP 的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为 [0, 255],则 MAP 矩阵的大小为 256×3,用 MAP=[RGB] 表示。MAP 中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP 中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为 64,则该像素就与 MAP 中的第 64 行建立了映射关系,该像素在屏幕上的实际颜色由第 64 行的 [RGB] 组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵 MAP 得到。
真彩色 RGB 图像
RGB 图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB 图像每一个像素的颜色值(由 RGB 三原色表示)直接存放在图像矩阵中 ,由于每一像素的颜色需由 R、G、B 三个分量来表示,M、N 分别表示图像的行列数,三个 M×N 的二维矩阵分别表示各个像素的 R、G、B 三个颜色分量。 RGB 图像的数据类型一般为 8 位无符号整型。注意:在 OpenCV 等库中,通道的顺序通常是 BGR 而不是 RGB。
| 图像类型 | 通道数 | 像素值范围 | 主要特点 | 常见用途 |
|---|---|---|---|---|
| 二值图像 | 1 通道 | 0 或 1 | 每个像素只有黑与白两种值 | 形态学操作、二值化、轮廓检测 |
| 灰度图像 | 1 通道 | 0 到 255 | 每个像素表示灰度(亮度) | 图像预处理、物体检测、人脸识别 |
| 索引图像 | 1 通道 | 0 到 255(索引) | 像素值为颜色表的索引,颜色表决定实际颜色 | 存储压缩、较少颜色的图像表示 |
| RGB 图像 | 3 通道(R、G、B) | 0 到 255 | 每个像素由红、绿、蓝三个通道组成 | 普通彩色图像显示、图像处理与分析 |
简单总结:图像是由像素点组成的,每个像素点的取值范围为 [0, 255]。像素值越接近于 0,颜色越暗,接近于黑色;像素值越接近于 255,颜色越亮,接近于白色。
在深度学习中,我们使用的图像大多是彩色图,彩色图由 RGB 3 个通道组成,如下图所示:

二、卷积神经网络(CNN)概述
2.1 什么是卷积神经网络
卷积神经网络是深度学习在计算机视觉领域的突破性成果,专门用于处理图像、视频、语音等数据的神经网络。在计算机视觉领域,往往输入的图像尺寸很大,使用全连接网络的计算代价太高,且难以保留图像原有的空间特征,导致准确率不高。
卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络 。卷积层的作用就是用来自动学习、提取图像的特征。
CNN 网络主要由三部分构成:卷积层、池化层和全连接层构成:
-
卷积层:负责提取图像中的局部特征;
-
池化层:用来大幅降低参数量级(降维);
-
全连接层:类似人工神经网络的部分,用来输出想要的结果。
下图展示了 CNN 处理图像的基本流程(以分类任务为例):

上图中 CNN 要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车,那是什么车。
-
最左边是数据输入层:对数据做一些处理,比如去均值(各维度都减对应维度的均值,使得输入数据各个维度都中心化为 0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA 等。CNN 只对训练集做"去均值"这一步。
-
中间是卷积层(CONV) :线性乘积求和,提取图像中的局部特征;激励层(RELU) :ReLU 激活函数,将输入数据转换成输出数据;池化层(POOL):取区域平均值或最大值,大幅降低参数量级(降维)。
-
最右边是全连接层(FC):接收二维数据集,输出 CNN 模型预测结果。
2.2 卷积神经网络的应用
-
图像分类:最常见的应用,例如识别图片中的物体类别。
-
目标检测:检测图像中物体的位置和类别。
-
图像分割:将图像分成多个区域,用于语义分割。
-
人脸识别:识别图像中的人脸。
-
医学图像分析:用于检测医学图像中的异常(如癌症检测、骨折检测等)。
-
自动驾驶:用于识别交通标志、车辆、行人。
2.3 CNN 中的经典网络架构
-
LeNet-5:最早的 CNN 架构之一,证明了 CNN 在图像识别任务上的有效性。包含卷积层、池化层(子采样层)、全连接层。
-
AlexNet:显著提升了 ImageNet 图像分类的准确率,引入 ReLU 激活函数、Dropout 层,使用更大的卷积核和更多卷积核。
-
VGGNet:探索了网络深度对性能的影响,使用更小的卷积核(3×3)堆叠,增加网络深度。
-
GoogLeNet (Inception):提出 Inception 模块,并行使用不同大小的卷积核和池化操作,提高了网络效率。
-
ResNet:通过残差块(Residual Block)引入跳跃连接,解决了深度网络的梯度消失问题,使得训练非常深的网络成为可能。
-
DenseNet:通过密集连接(Dense Connectivity),每一层都接收前面所有层的输出作为输入,增强了特征传递和梯度流动。
三、卷积层详解
卷积层是 CNN 的核心,它通过卷积核(也称滤波器)在输入图像上滑动,提取局部特征。
卷积层的主要作用:
特征提取:从输入图像中提取低级特征(如边缘、角点、纹理等)。通过多个卷积层的堆叠,网络能够逐渐从低级特征到高级特征(如物体的形状、区域等)进行学习。
权重共享:同一个卷积核在整个输入图像上共享权重,使得卷积层的参数数量大大减少,减少了计算量并提高了训练效率。
局部连接 :每个神经元仅与输入图像的一个小局部区域相连,称为局部感受野,这种局部连接方式更符合图像的空间结构,有助于捕捉图像中的局部特征。
空间不变性 :由于卷积操作是局部的并且采用权重共享,卷积层在处理图像时具有平移不变性。不论物体出现在图像的哪个位置,卷积层都能有效地检测到这些物体的特征。
3.1 卷积计算
下图展示了单通道卷积的基本过程:

-
input 表示输入的图像;
-
filter 表示卷积核(也叫做滤波器或滤波矩阵),它是一组固定的权重。一个卷积核就是一个神经元;
-
input 经过 filter 得到右侧的特征图(feature map)。
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积(对应元素相乘后求和)。
下面以一个具体例子说明计算过程。假设输入图像为 5×5,卷积核为 3×3,步长为 1,无填充:

更直观地,图像上的卷积可以理解为:输入是一定区域大小的数据,和滤波器(带着一组固定权重的神经元)做内积后得到新的二维数据。

图中左边是图像输入,中间是滤波器(带着一组固定权重的神经元),不同的滤波器会得到不同的输出数据,比如颜色深浅、轮廓。如果想提取图像的不同特征,则用不同的滤波器,提取想要的关于图像的特定信息:颜色深浅或轮廓。
3.2 Padding(填充)
通过上面的卷积计算过程,最终的特征图比原始图像小很多。如果想要保持经过卷积后的图像大小不变,可以在原图周围添加 Padding 来实现。
Padding(填充)操作是一种**在输入特征图的边界周围添加额外像素(通常是零)**的方法。
Padding 的主要作用:
-
保持空间维度:如果不使用 padding,每次卷积操作后,特征图的尺寸都会缩小。多次卷积后,特征图会变得非常小,可能会丢失重要的边缘信息。Padding 可以帮助维持输出特征图的尺寸与输入相同或接近相同。
-
保留边缘信息:图像边缘的像素在卷积过程中参与的计算次数较少,这意味着边缘信息在特征提取过程中容易丢失。Padding 通过在边缘添加额外的像素,增加了边缘像素的参与度,从而更好地保留了边缘信息。
-
提高性能:Padding 有助于避免由于特征图尺寸快速缩小而导致的信息丢失,从而提高模型的性能,尤其是在处理较小的图像或需要进行多层卷积时。
Padding 的类型:
-
Valid Padding (No Padding):不进行任何填充。卷积核只在输入图像的有效区域内滑动。输出尺寸会缩小。
-
Same Padding:添加足够的填充,使得输出特征图的尺寸与输入相同。
-
Full Padding:尽可能多地添加填充,使得卷积核的每个元素都至少在输入图像上滑动一次。输出尺寸会增大。
3.3 Stride(步长)
Stride(步长)指的是卷积核在图像上滑动时的步伐大小,即每次卷积时卷积核在图像中向右(或向下)移动的像素数。步长直接影响卷积操作后输出特征图的尺寸,以及计算量和模型的特征提取能力。
Stride 的作用:
-
降低计算复杂度:更大的步长意味着卷积核移动的次数更少,从而减少了计算量,并加快了训练和推理速度。
-
减小输出尺寸:步长越大,生成的特征图尺寸越小。这类似于池化的降维效果。
-
增大感受野:虽然更大的步长会减小特征图的尺寸,但它同时也会增大每个神经元在输入数据上的感受野。这意味着每个神经元能够捕捉到更大范围的输入信息。
Stride 的选择:
-
Stride = 1:最常见的设置,尤其是在网络的早期层。它允许保留更多的空间细节。
-
Stride > 1:通常用于减小特征图的尺寸和增大感受野,例如在网络的后期层或需要进行快速降维时。常见的设置包括 stride=2 或 stride=4。
3.4 多通道卷积计算
实际中的图像往往是多通道的(例如 RGB 三个通道)。多通道卷积的计算方法如下:
-
当输入有多个通道(Channel)时,卷积核需要拥有相同的通道数。即图像有多少通道,每个卷积核就有多少通道。
-
每个卷积核通道与对应的输入图像的各个通道进行卷积。
-
将每个通道的卷积结果按位相加,得到最终的特征图(单通道)。
如下图所示(输入 3 通道,卷积核也是 3 通道):

3.5 多卷积核卷积计算
实际对图像进行特征提取时,我们需要使用多个卷积核,从不同角度、不同视角提取特征。当使用多个卷积核时,每个卷积核独立进行上述多通道卷积,产生一个特征图。最终输出通道数等于卷积核个数。
下图展示了两个卷积核的情况:

3.6 特征图尺寸计算公式
输出特征图的大小与以下参数息息相关:
-
size: 卷积核/过滤器大小,一般会选择为奇数,比如有
1*1,3*3,5*5 -
Padding: 零填充的方式
-
Stride: 步长
那计算方法如下图所示:
-
输入图像大小: W x W
-
卷积核大小: F x F
-
Stride: S
-
Padding: P
-
输出图像大小: N x N
公式图示如下:

例如,当图像大小为 5×5,卷积核大小为 3×3,步长 S=1,填充 P=1 时,计算得:
N=5−3+2×11+1=5N=15−3+2×1+1=5
输出特征图尺寸为 5×5。
四、池化层详解
池化层通常位于卷积层之后,它通过对卷积层输出的特征图进行下采样,保留最重要的特征信息,同时丢弃一些不重要的细节。
池化层的主要作用:
降维和计算量减少:通过减少特征图的尺寸,降低计算量,特别是在多层网络中,池化能够显著减少计算资源的消耗。
提高鲁棒性:池化操作可以使得特征对小的变换、平移和旋转变得更加不敏感,模型在面对噪声或图像的轻微变化时依然能够稳定工作。
防止过拟合:通过池化减少了特征图的大小,减少了模型的复杂度,有助于防止过拟合。
抽象特征:提取更为抽象和高层次的特征,使得网络能够学习到更具泛化能力的表示。
4.1 池化计算
最常见的池化操作是最大池化 和平均池化。
-
最大池化(Max Pooling):在池化窗口内取最大值作为输出。它能够保留局部区域最显著的特征,常用于卷积层之后。
-
平均池化(Avg Pooling):在池化窗口内取平均值作为输出。它能够保留整体信息,常用于网络较深的位置或全连接层之前。
下图演示了最大池化(上)和平均池化(下)的过程,窗口大小 2×2,步长 2,无填充:


4.2 Padding 与 Stride 在池化中的应用
池化层同样可以设置 Padding 和 Stride,其作用与卷积层类似,用于控制输出尺寸。
-
Padding:在输入特征图周围填充零值(通常很少使用,因为池化本身就会缩小尺寸)。填充后,边缘区域也能参与池化计算。
-
Stride:池化窗口每次移动的步长。步长越大,输出尺寸越小。
4.3 多通道池化计算
在处理多通道输入数据时,池化层对每个输入通道分别进行池化 ,而不是像卷积层那样将各个通道的输入相加。这意味着池化层的输出通道数与输入通道数相等。池化只在宽高维度上进行,通道维度不进行任何融合。
五、总结
本文系统地讲解了卷积神经网络(CNN)的基础知识,包括:
-
图像基础:像素、颜色通道、图像类型及加载方式。
-
CNN 概述:为什么需要 CNN、CNN 的构成(卷积层、池化层、全连接层)及其经典架构。
-
卷积层:卷积计算过程、Padding 与 Stride 的作用、多通道与多卷积核的处理、特征图尺寸计算公式。
-
池化层:池化的作用、最大池化与平均池化的区别、Padding 与 Stride 的应用、多通道池化的独立性。
这些理论是理解 CNN 后续实战的基础。在接下来的文章中,我们将使用 PyTorch 实际演示卷积层和池化层的代码实现,并通过可视化特征图加深理解。最后,我们将构建一个完整的 CNN 模型,在 CIFAR-10 数据集上完成图像分类任务,并尝试优化模型以提升性能。
下一篇预告:PyTorch 卷积与池化实战------从代码到特征图可视化。