初识卷积神经网络(CNN):从卷积到分类的一条完整链路(B站学习总结 + CNN Explainer 实操)

学习来源说明:本文是我在 B 站跟随 up 主相关视频学习 CNN 的笔记式总结与整理(面向初学者)。内容以“看懂 CNN 的数据流”为目标:卷积 →(激活)→ 池化 → 展平 → 全连接 → 输出,并推荐使用在线工具 CNN Explainer 做交互式巩固。


1. 为什么需要 CNN?

在图像任务里,像素并不是“互相独立”的:

  • 邻域像素往往共同构成边缘、纹理、角点等结构;
  • 同一种局部模式(例如竖直边缘)可能出现在图像的不同位置。

CNN 的核心思想是:

局部感受野 + 参数共享(卷积核重复使用)来高效提取局部特征,并逐层组合成更抽象的语义表示。


2. 卷积(Convolution):用“特征过滤器”提取局部模式

2.1 卷积核做了什么?

卷积层用一个小窗口(常见 3×3)在图像上滑动。每到一个位置,就取出当前覆盖的像素块,与卷积核进行逐元素乘积并求和,得到一个数值,这个数值填入输出特征图对应位置。

形式化写法(离散情形)可以理解为:

y(i,j)=∑u=1k∑v=1kx(i+u,j+v)⋅w(u,v) y(i,j)=\sum_{u=1}^{k}\sum_{v=1}^{k} x(i+u, j+v)\cdot w(u,v) y(i,j)=u=1kv=1kx(i+u,j+v)w(u,v)

其中 (k=3) 时就是 3×3 卷积核。你可以把卷积核看成一个“模板”,它会对特定模式(例如竖直边缘)给出更高响应。

对应你图中的示例:输入 6×6,卷积核 3×3,若不加边界扩展且步幅 stride=1,则输出大小为
(6−3+1)×(6−3+1)=4×4 (6-3+1)\times(6-3+1)=4\times 4 (63+1)×(63+1)=4×4
这正是你图一中从 6×6 得到 4×4 的原因。

在这里插入图片描述
如图1所示,卷积核以 stride=1 在输入上滑动,每次对 3×3 区域做逐元素乘积求和,得到输出特征图的一个像素点。


2.2 为什么会“边缘特征丢失”?——Padding 的意义

当我们不使用 padding 时,卷积核无法完整覆盖输入的边缘区域,导致边缘信息在多层卷积后更容易被“消耗”掉(输出尺寸也逐层变小)。

为缓解这一问题,我们常用 零填充(zero padding):在图像外围补 0。

  • 例如在 6×6 外围补一圈 0(padding=1),输入会变成 8×8;
  • 再用 3×3 卷积、stride=1,则输出大小为
    (8−3+1)×(8−3+1)=6×6 (8-3+1)\times(8-3+1)=6\times 6 (83+1)×(83+1)=6×6
    也就是输出与原输入保持同尺寸,更有利于保留边缘特征。

直观理解:padding 允许卷积核“站在边缘外”去感受边缘,使边缘像素也能作为卷积中心参与计算。


2.3 还缺一个关键点:Stride 与多通道/多卷积核

  • Stride(步幅):卷积核每次滑动的步长。stride 越大,输出越小,压缩越强,但细节可能损失更多。
  • 多卷积核(多过滤器):实际 CNN 中通常不是一个卷积核,而是一组卷积核(例如 32/64 个)。
    • 每个卷积核会学到一种不同的模式(边缘、纹理、角点等);
    • 输出会形成多个特征图,堆叠成一个“特征体”(feature volume)。
  • 通道(channel):灰度图 1 通道、RGB 图 3 通道。对 RGB 图像,卷积核一般是 3×3×3,对三个通道分别做加权再求和。

3. 非线性激活(Activation):让网络具备表达能力

仅靠线性卷积叠加,本质仍是线性变换,表达能力有限。
因此卷积后通常接一个非线性激活函数(最常见 ReLU):

ReLU(x)=max⁡(0,x) \mathrm{ReLU}(x)=\max(0,x) ReLU(x)=max(0,x)

它的作用是:

  • 引入非线性,使网络可以拟合更复杂的决策边界;
  • 训练稳定、计算简单。

很多入门讲解会把“卷积+ReLU”一起视为一个基本特征提取单元。


4. 池化(Pooling):下采样与“保留最显著特征”

你在笔记中提到的 **最大池化(Max Pooling)**非常典型。其核心目的:

  1. 压缩空间尺寸,减少计算量与参数规模;
  2. 提升一定的平移不变性(小范围移动不影响最强响应)。

以 6×6 特征图为例,若使用 2×2 的最大池化、stride=2:

  • 将特征图划分成 3×3 个小区域;
  • 每个区域取最大值,得到 3×3 输出。

这与图二展示的过程一致:保留“最突出”的响应,相当于保留最强特征证据。
在这里插入图片描述
图2展示了 2×2 最大池化的下采样过程:每个 2×2 区域仅保留最大响应,以压缩尺寸并突出关键信息。

需要补充的一点:池化不是“越多越好”。过度下采样会损失细粒度信息,因此现代网络中也常用 stride 卷积替代部分池化,或谨慎控制下采样次数。


5. 展平(Flatten):把二维特征变成可分类的向量

池化后得到的仍是二维(或多通道的三维特征体)。为了接入全连接层,我们通常将其展平为一维向量:

  • 若有 2 个 3×3 特征图,则展平后长度为 (2\times 3\times 3=18)。
  • 这一步不会“学习参数”,只是形状变换,目的是将空间特征组织成向量供后续分类使用。

6. 全连接层(Fully Connected, FC):综合全局特征做判别

全连接层可以理解为:

将展平向量与若干隐藏层神经元相连,综合不同位置、不同通道的特征证据,输出最终分类结果。

  • 隐藏层:融合局部特征为更抽象的表示;
  • 输出层:根据任务选择合适的输出函数。

常见输出方式:

6.1 二分类:Sigmoid

σ(x)=11+e−x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
输出在 0~1 之间,表示“属于正类”的概率。

6.2 多分类:Softmax

softmax(zi)=ezi∑jezj \mathrm{softmax}(z_i)=\frac{e^{z_i}}{\sum_{j}e^{z_j}} softmax(zi)=jezjezi
输出一个概率分布,例如手写数字识别中给出属于 0–9 的概率。

在这里插入图片描述
前面的模块串起来就形成图3所示的典型 CNN:卷积提特征,池化做压缩,展平后交给全连接层输出分类结果。


7. 一个“完整 CNN 前向流程”小结

把上面的组件串起来,一个典型 CNN 的数据流可以写成:

  1. 输入图像(H×W×C)
  2. 卷积(若干卷积核)→ 得到多张特征图
  3. ReLU(引入非线性)
  4. 池化(下采样、保留强响应)
  5. 重复“卷积+ReLU+池化”(逐层抽象)
  6. Flatten(展平)
  7. 全连接层(融合全局信息)
  8. Sigmoid/Softmax 输出类别概率

8. 动手巩固:CNN Explainer 怎么用?

为了把“抽象流程”变成“可见的计算过程”,我非常推荐使用在线交互工具 CNN Explainer 来做以下练习:

  • 观察某个卷积核对输入的响应:它更像是在提取边缘?纹理?还是块状结构?
  • 修改输入或激活,观察特征图如何变化;
  • 理解“多卷积核 → 多特征图 → 通道堆叠”的概念;
  • 看看池化如何改变特征图分布,以及它为什么能压缩但保留关键信息。

在这里插入图片描述

建议练习顺序:先只看 单层卷积 的局部加权求和,再看 padding/stride 对尺寸的影响,最后观察 池化与全连接 如何把特征变成分类结果。


9. 初学者常见易错点

  • 把卷积当成“简单裁剪”:卷积不是截取,而是“加权求和”的特征响应。
  • 忽视 padding/stride 的尺寸变化:输出尺寸一变,后面层的形状都会连锁变化。
  • 忘记激活函数的重要性:没有非线性,深层网络表达能力会大打折扣。
  • 过度依赖池化:下采样太猛会损失细节,影响小目标或细纹理任务。
  • 把 Flatten 误以为“提取特征”:Flatten 只是 reshape,不学习任何参数。

总结

好啦,本文到这里就结束啦!这篇文章主要是我在 B 站跟着 up 主学习 CNN 的一个小总结:我们从“卷积核在图像上滑动”开始,理解了卷积是怎么把局部像素算成特征图的;也知道了为什么会丢边缘信息,以及用 padding 把边缘补零后就能更完整地提取特征;接着用 max pooling 把特征图压缩一波,保留最明显的关键信息;最后把特征 flatten 成一条向量,交给 全连接层 做最终分类输出(Sigmoid/Softmax)。

如果你是第一次接触 CNN,建议一定去玩一下 CNN Explainer,边拖边看特征图变化,理解会快很多。希望这篇入门笔记能对你有一点点帮助~欢迎在评论区讨论,我们一起进步!


如果你也在 B 站跟学 CNN,欢迎把你看的是哪位 up 主、你使用的示例数据(例如 MNIST)告诉我,我可以把本文进一步改成更贴合你视频内容的版本,并附上“对照式笔记”(视频段落 → 对应知识点)。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐