卷积神经网络(Convolutional Neural Network),是深度学习里专门处理图像、视频、语音等 “网格型数据”的神经网络。
# 背景:MLP 不适用于图像处理
假设你有一张 28×28 的黑白手写数字图片,如 MNIST 数据集。
# 1️⃣ MLP 的做法:拉平
图片 (28×28) → 拉成向量 (784 个数字) → 输入全连接层
问题:
- 丢失空间信息:像素之间的上下左右关系没了。
- 参数爆炸:如果图片是 224×224×3 (RGB),输入就是 150,528 维。第一层如果有 1000 个神经元,光权重就有 1.5 亿个,显存直接爆掉。
- 无法识别位置变化:猫在左上角和右下角,MLP 可能认为是两种东西。
# 2️⃣ CNN 的做法:保留结构
图片 (28×28×1) → 卷积层提取特征 → 池化层缩小 → 分类
优势:
- 保留空间结构:知道相邻像素的关系。
- 参数共享:同一个滤波器扫描整张图,参数极少。
- 平移不变性:猫在左边还是右边,都能认出来。
# CNN 的核心组件(三大件)


CNN 主要由三种层交替堆叠而成:
输入 → [卷积层] → [激活函数] → [池化层] → ... → [全连接层] → 输出
(提取特征) (非线性) (缩小尺寸) (分类)
# 1️⃣ 卷积层(Convolutional Layer)⭐ 核心
作用:提取特征(边缘、纹理、形状)。
工作原理:用一个卷积核(Filter/Kernel)在图片上滑动扫描。


术语
含义
作用
卷积核(滤波器)
一个小矩阵(如 3×3)
用来提取特定特征(如竖线、横线)
填充 (Padding)
在图片周围补 0
保持输出尺寸不变,保留边缘信息
步幅 (Stride)
每次滑动几格
步长越大,输出越小
通道 (Channel)
彩色图有 3 通道 (RGB)
卷积核也有深度,对应输入通道
直观理解
1. 不同的
卷积核就像不同的"滤镜",有的专门找边缘,有的专门找圆形。
2. 有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)
卷积:乘积累加求和

填充 Padding:向输入数据的周围填入固定数据

步幅 Stride:指定卷积核的间隔

通道 Channel:各层(通道)卷积结果之和

# 2️⃣ 池化层(Pooling Layer)
作用:缩小尺寸,减少计算量,保留主要特征。
特点:① 没有要学习的参数(只是提取出值);② 通道数不发生变化
常见类型:
类型
做法
比喻
最大池化 (Max Pooling)
取区域内最大值
"只保留最显著的特征" ⭐ 最常用
平均池化 (Average Pooling)
取区域内平均值
"保留整体背景信息"

💡 为什么池化?
图片太大,计算太慢。池化就像把高清大图变成缩略图,猫还是猫,但像素少了很多。
# 3️⃣ 全连接层(Fully Connected Layer)
作用:最后进行分类。
位置:通常在 CNN 的末尾。
- 前面卷积 + 池化已经把图片变成了高级特征向量。
- 全连接层把这些特征整合起来,输出"这是猫"还是"这是狗"。
卷积提取的特征 → 全连接层 → 概率输出
[0.9, 0.1...] (MLP) [猫:90%, 狗:10%]
# 经典 CNN 架构流程
输入图片 (32×32×3)
↓
[卷积层 1] → 提取边缘 → (32×32×32)
↓
[池化层 1] → 缩小一半 → (16×16×32)
↓
[卷积层 2] → 提取纹理 → (16×16×64)
↓
[池化层 2] → 缩小一半 → (8×8×64)
↓
[卷积层 3] → 提取形状 → (8×8×128)
↓
[展平 Flatten] → 变成向量 → (1024)
↓
[全连接层] → 分类 → (10 类)
↓
输出 (Softmax)
📌 规律:
1. 越往后,
图片尺寸越小,通道数(特征数量)越多。
2. 前面学简单特征(边、角),后面学复杂特征(眼睛、耳朵)。
# CNN 中的正则化与 BN
组件
常见位置
备注
BatchNorm
卷积层之后,激活函数之前
Conv → BN → ReLU ⭐ 标准配置
Dropout
全连接层之前
卷积层通常不用 Dropout(用 BN 代替)
L2 正则
优化器中
weight_decay 全局生效
数据增强
数据加载时
旋转、裁剪对 CNN 特别有效
# 代码实例(PyTorch)
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
# 1. 卷积层 (输入 1 通道,输出 32 通道,卷积核 3x3)
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
self.bn1 = nn.BatchNorm2d(32) # 批归一化
# 2. 卷积层 (输入 32 通道,输出 64 通道)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(64)
# 3. 池化层 (2x2 最大池化)
self.pool = nn.MaxPool2d(2, 2)
# 4. 全连接层 (展平后 64*14*14 → 128 → 10)
self.fc1 = nn.Linear(64 * 14 * 14, 128)
self.dropout = nn.Dropout(0.5) # 全连接层前用 Dropout
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
# 卷积块 1
x = self.conv1(x)
x = self.bn1(x)
x = F.relu(x)
x = self.pool(x) # 尺寸减半
# 卷积块 2
x = self.conv2(x)
x = self.bn2(x)
x = F.relu(x)
x = self.pool(x) # 尺寸再减半
# 展平
x = x.view(-1, 64 * 14 * 14)
# 全连接
x = self.dropout(x)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
return x
# CNN 的进阶架构
随着深度学习发展,CNN 也在进化:
架构
年份
核心创新
地位
LeNet-5
1998
最早的 CNN
祖师爷
AlexNet
2012
ReLU + Dropout + GPU
深度学习爆发起点
VGG
2014
用小卷积核堆叠
结构规整,常用 backbone
ResNet
2015
残差连接 (跳过层)
解决了梯度消失,可训练上百层 ⭐
EfficientNet
2019
复合缩放
效率最高
💡 现在工业界最常用:ResNet 系列(如 ResNet18, ResNet50)
参考书籍:斋藤康毅.深度学习入门:基于 Python 的理论与实现 [M]. 陆宇杰,译.北京:人民邮电出版社,2018. ISBN 978-7-115-48558-8.