卷积神经网络入门:从原理到实践
本文旨在帮助读者深入理解卷积神经网络(CNN)的基本原理,并揭示其在计算机视觉任务中表现卓越的原因。我们将通过构建一个简单的CNN模型,对MNIST手写数字数据集进行分类,从而直观地展示其工作流程与优势。
构建一个基础的卷积神经网络
在之前使用全连接(密集)网络处理MNIST数据时,模型的测试准确率约为97.8%。接下来,我们尝试采用卷积神经网络来提升性能。以下是该模型的实现代码:
from tensorflow import keras from tensorflow.keras import layers # 定义输入张量形状 inputs = keras.Input(shape=(28, 28, 1)) x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(inputs) x = layers.MaxPooling2D(pool_size=2)(x) x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x) x = layers.MaxPooling2D(pool_size=2)(x) x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x) x = layers.Flatten()(x) outputs = layers.Dense(10, activation="softmax")(x) model = keras.Model(inputs=inputs, outputs=outputs)
值得注意的是,该卷积神经网络接收的输入张量维度为:
(image_height, image_width, image_channels)
其中不包含批量维度。本例中所使用的输入尺寸为:
(28, 28, 1)
这恰好与MNIST图像的标准格式一致。
模型结构解析
下面是对上述卷积神经网络架构的具体分析:
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 28, 28, 1)] 0
_________________________________________________________________
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 3, 3, 128) 73856
_________________________________________________________________
flatten (Flatten) (None, 1152) 0
_________________________________________________________________
dense (Dense) (None, 10) 11530
=================================================================
Total params: 104,202
Trainable params: 104,202
Non-trainable params: 0
_________________________________________________________________
观察可知,每一个
Conv2D
和
MaxPooling2D
操作后的输出均为一个三维张量,其形状如下:
(height, width, channels)
随着网络层数加深,特征图的宽度和高度通常会逐渐减小,而通道数量则由卷积层的第一个参数决定,如32、64或128。
在最后一个卷积层之后,输出的张量形状变为:
(3, 3, 128)
为了将此三维特征输入到后续的全连接分类器中,我们首先使用
Flatten
层将其展平为一维向量,然后再接入
Dense
层完成最终的类别预测。
模型训练与性能评估
接下来,我们在MNIST数据集上对该卷积神经网络进行训练:
from tensorflow.keras.datasets import mnist
# 加载并准备数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype("float32") / 255
# 编译模型
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
# 开始训练
model.fit(train_images, train_labels, epochs=5, batch_size=64)
训练完成后,我们对模型在测试集上的表现进行评估:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc:.3f}")
运行结果如下:
Test accuracy: 0.991
相较于此前全连接网络的97.8%准确率,当前卷积神经网络达到了99.1%的测试精度,错误率相对降低了约60%,效果显著提升。
为何卷积神经网络更具优势?
相比于传统的密集连接网络,卷积神经网络之所以在图像识别任务中表现更优,关键在于两者学习模式的本质差异:
- Dense层:学习的是全局特征模式,即依赖于整个输入空间的所有像素点之间的关系。
- 卷积层:专注于提取局部特征模式,仅关注图像中局部区域的小范围窗口内信息。
这种设计赋予了卷积神经网络两个重要特性:
- 平移不变性:一旦某个特征模式在图像某处被成功识别(例如右下角),那么无论它出现在图像的哪个位置,网络都能有效检测到。这一性质极大增强了模型的数据利用效率,使其能在较少样本的情况下获得良好的泛化能力。
- 空间层次结构感知能力:卷积网络能够逐层构建从简单边缘、角点到复杂纹理和对象部件的分层表示,形成对图像内容的多层次理解,从而更有效地捕捉视觉语义信息。
卷积神经网络能够逐步学习从简单到复杂的视觉特征:首个卷积层通常识别基础的局部结构(如边缘),第二个卷积层则组合这些初级特征以检测更广泛的模式,后续层继续构建更高层次、更具抽象性的表示。这种层级化特征提取机制使模型能有效捕捉图像中的复杂语义信息。
padding
深入理解卷积运算
卷积操作作用于一个三维张量,称为特征图,包含两个空间维度(高度和宽度)以及一个深度维度(通道轴):
- 对于RGB图像,通道数为3,分别对应红、绿、蓝三个颜色通道
- 对于灰度图像(例如MNIST数据集中的图像),通道数为1,仅表示单一灰度值
该过程通过在输入特征图上滑动一个小窗口(常见为3×3或5×5),提取每个位置的局部区域,并对所有这些图块应用相同的线性变换,最终生成一个新的输出特征图。每一个输出通道对应一个可学习的滤波器,用于响应输入中特定类型的特征。
卷积的核心参数
- 图块尺寸:即卷积核大小,常用3×3或5×5
- 输出深度:决定使用的滤波器数量,控制输出特征图的通道数
工作原理简述:在三维输入特征图上移动指定大小的窗口,从每个位置抽取一个局部三维图块;然后将该图块与一个可训练的权重矩阵(即卷积核)进行逐元素乘法并求和(张量积),得到一个标量响应;所有位置完成计算后,将结果按空间位置重组为新的三维输出特征图。
边界处理与填充策略
由于滑动窗口无法完全覆盖边界区域,原始卷积会导致输出特征图的空间尺寸缩小。例如,在5×5的输入上使用3×3的卷积核,仅有9个中心点可以完整容纳窗口,导致输出变为3×3。
为了保持空间分辨率不变,常采用填充技术——在输入的四周添加额外的行和列。对于3×3卷积核,只需在每侧填充1行或1列即可维持尺寸一致。
Keras中通过以下参数控制填充方式:
'valid':不进行填充,仅使用有效区域(无越界的操作)'same':自动填充,使得输出的高度和宽度与输入相同
"valid""same"
步幅与下采样机制
步幅定义了相邻卷积窗口之间的移动距离,默认为1。当设置步幅大于1时(如步幅=2),称为步进卷积,可实现对特征图的空间降维,相当于在宽度和高度方向均执行2倍下采样。
然而,在多数图像分类任务中,我们更倾向于使用最大汇聚而非大步幅卷积来进行下采样。
最大汇聚的作用与优势
最大汇聚通过对输入特征图上的局部区域取最大值来生成输出,其操作方式类似于卷积,但使用的是固定的、非学习的规则(即取最大值),而不是可学习的权重矩阵。
典型配置为2×2的窗口配合步幅2,从而实现特征图尺寸减半。
为何选择最大值而非平均值?因为在特征图中,关键信息往往体现为某个模式是否出现在某区域,而最大值更能反映这种“存在性”特征,相比均值更具判别力。
max
下采样的意义
- 降低后续层需要处理的数据量,提升计算效率
- 通过逐层扩大感受野,使高层卷积核能够感知更大范围的空间上下文,形成具有层级结构的感受域体系
总结
本文介绍了卷积神经网络的基础组件:特征图、卷积运算和最大汇聚。你已经了解了它们的工作机制及其在构建图像识别模型中的作用。凭借局部连接、权重共享和空间下采样三大特性,卷积神经网络在图像分类等任务中表现出卓越性能,成为现代计算机视觉技术的核心支柱。


雷达卡


京公网安备 11010802022788号







