卷积神经网络(CNN)原理
本教程共 60 篇 · 第 20 篇 · 更新于 2026-08-17 · 约 3 分钟阅读
本节目标:搞懂卷积为什么适合图像,理解卷积核、特征图、池化这些核心概念,并会用
nn.Conv2d。
图像为什么难搞
一张 32×32 的彩色小图,有 3 个颜色通道,展开就是 3072 个数。全连接层要把每个像素都和下一层相连,光一层就要几百万甚至上千万参数。图像再大点,比如 224×224,直接爆掉。
还有更本质的问题:全连接把像素排成一串,完全丢掉了空间结构。相邻像素明明关系密切,摊平之后就毫无线索。
卷积神经网络(CNN,Convolutional Neural Network)就是为图像而生的答案。
卷积:窗口滑过全图
卷积层干的事,可以想象成拿一个放大镜在图上滑动。放大镜就是卷积核(kernel,也叫滤波器 filter),通常是个 3×3 或 5×5 的小矩阵。
核停在一个位置,和覆盖区域逐元素相乘再求和,得到一个数。然后往右滑一步,继续算。整张图滑完,得到一张新图,叫特征图(feature map)。
举个例子,输入是一块 3×3 区域,核是一个 X 形的 3×3 小矩阵(四个角加中心是 1,其余是 0):
输入区域 卷积核 逐元素相乘后求和
1 2 3 1 0 1
4 5 6 0 1 0 1+3+5+7+9 = 25
7 8 9 1 0 1
核把 X 位置上的数挑出来加总,得到 25。核换成别的数字,挑出来的特征就不同。
每个核负责找一种特征:有的核看到横边兴奋,有的核专门响应竖边。核里的数字不是人设计的,是训练学出来的。
两大法宝:局部连接和参数共享
对比全连接,卷积赢在两个关键设计:
- 局部连接(local connectivity):每个输出只看输入的一小块区域,不是全图
- 参数共享(parameter sharing):同一个核滑遍全图,参数只存一份
算笔账就懂了。一个 3×3 核只要 9 个权重,加 1 个偏置。参数少了几个数量级,还保证「学到的边缘检测器,在图片任何位置都管用」。
现代网络还偏爱 3×3 这种小核:两个 3×3 叠起来,视野等于一个 5×5,参数却只有 18 个对 25 个。同样的视野,更省参数,还多了一层非线性,何乐而不为。
Note参数共享带来一个副产品:平移不变性。猫在图片左边还是右边,同一个核都能识别出猫的轮廓。
padding 和 stride
滑动窗口有两个调节旋钮。padding(填充)是在图像边缘补一圈 0,防止边缘信息被丢弃,也能让输出尺寸不变。stride(步幅)是每次滑几步,步子越大,输出越小。
PyTorch 里这样用:
import torch.nn as nn
# 输入 1 通道,输出 6 通道,3x3 核,边缘补 1,步幅 1
conv = nn.Conv2d(in_channels=1, out_channels=6,
kernel_size=3, padding=1, stride=1)
输出通道数就是用了几个核,几个核就得到几张特征图。
NotePyTorch 里图像张量的形状是 (batch, 通道, 高, 宽),和很多图像库的 (高, 宽, 通道) 相反。用 torchvision 加载数据时已经帮你排好,自己写数据加载器时别弄反。
想预测输出尺寸,记一个公式:输出边长 = (输入边长 + 2×padding − 核大小) ÷ stride + 1。比如 32×32 的图,5×5 核不填充,算出 (32 − 5) ÷ 1 + 1 = 28。LeNet 第一层就是这个数字,经典结构都能用公式验算。
池化:压缩但不丢重点
特征图还是太大,计算量吃不消。池化(pooling)负责降采样,常见两种:
- 最大池化(max pooling):取窗口里最大的数,相当于问「这块区域里最强烈的特征是什么」
- 平均池化(average pooling):取窗口平均值,信息更平滑
池化没有参数,规则固定。它一边缩小尺寸,一边保留主要特征,顺带让模型对轻微位移不敏感。
Note池化窗口大小一般取 2,一步跨 2。窗口取太大,信息丢得太多,小物体可能直接被抹掉。
import torch.nn.functional as F
x = torch.randn(1, 6, 28, 28) # batch 1,6 通道,28x28
x = F.max_pool2d(x, 2) # 尺寸减半
print(x.shape) # torch.Size([1, 6, 14, 14])
典型结构:卷积堆叠 + 全连接收尾
经典 CNN 长这样:
- 卷积 + ReLU + 池化,重复几轮:不断提取特征、缩小尺寸
- 把特征图展平(flatten)
- 接几层全连接,输出分类结果
前面的部分当「特征提取器」,全连接部分当「分类器」。LeNet、AlexNet 都是这个骨架,只是更深更宽。
还有个细节:为什么特征图数量(通道数)一路上涨?因为越往后,每张特征图越「专精」一种特征,需要更多特征图才够描述。而空间尺寸一路缩小,正好抵消了通道数变多带来的计算量。一升一降,整体开销稳稳的。
感受野:看得多远
感受野(receptive field)指输出上的一个点,对应输入图上的多大区域。卷积层越叠越多,感受野越来越大,网络就能看到越来越全局的信息。
底层卷积看细节,比如边缘、纹理;高层卷积看整体,比如眼睛、轮子。这也是 CNN 能层层递进理解图像的原因。
Tip看 CNN 时抓住一条主线:卷积找特征,池化压尺寸,全连接做决策。第 21 章我们就动手搭一个真正的 CNN,用 CIFAR-10 练手。
概念速查
怕你回头看时翻不动,把本章的关键词列在这里:卷积核是滑动的小窗口,特征图是卷积后的新图,padding 是补边,stride 是步长,池化是压缩,感受野是视野范围。六个词串成一句话:拿核按步长扫图,补边后得到特征图,池化压缩,视野越扫越大。