初识CNN:从卷积到分类的一条完整链路(B站学习总结 )
初识卷积神经网络(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=1∑kv=1∑kx(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) imes(6-3+1)=4 imes 4 (6−3+1)×(6−3+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) imes(8-3+1)=6 imes 6 (8−3+1)×(8−3+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)**非常典型。其核心目的:
- 压缩空间尺寸,减少计算量与参数规模;
- 提升一定的平移不变性(小范围移动不影响最强响应)。
以 6×6 特征图为例,若使用 2×2 的最大池化、stride=2:
- 将特征图划分成 3×3 个小区域;
- 每个区域取最大值,得到 3×3 输出。
这与图二展示的过程一致:保留“最突出”的响应,相当于保留最强特征证据。

图2展示了 2×2 最大池化的下采样过程:每个 2×2 区域仅保留最大响应,以压缩尺寸并突出关键信息。
需要补充的一点:池化不是“越多越好”。过度下采样会损失细粒度信息,因此现代网络中也常用 stride 卷积替代部分池化,或谨慎控制下采样次数。
5. 展平(Flatten):把二维特征变成可分类的向量
池化后得到的仍是二维(或多通道的三维特征体)。为了接入全连接层,我们通常将其展平为一维向量:
- 若有 2 个 3×3 特征图,则展平后长度为 (2 imes 3 imes 3=18)。
- 这一步不会“学习参数”,只是形状变换,目的是将空间特征组织成向量供后续分类使用。
6. 全连接层(Fully Connected, FC):综合全局特征做判别
全连接层可以理解为:
将展平向量与若干隐藏层神经元相连,综合不同位置、不同通道的特征证据,输出最终分类结果。
- 隐藏层:融合局部特征为更抽象的表示;
- 输出层:根据任务选择合适的输出函数。
常见输出方式:
6.1 二分类:Sigmoid
σ(x)=11+e−x
sigma(x)=rac{1}{1+e^{-x}}
σ(x)=1+e−x1
输出在 0~1 之间,表示“属于正类”的概率。
6.2 多分类:Softmax
softmax(zi)=ezi∑jezj
mathrm{softmax}(z_i)=rac{e^{z_i}}{sum_{j}e^{z_j}}
softmax(zi)=∑jezjezi
输出一个概率分布,例如手写数字识别中给出属于 0–9 的概率。

前面的模块串起来就形成图3所示的典型 CNN:卷积提特征,池化做压缩,展平后交给全连接层输出分类结果。
7. 一个“完整 CNN 前向流程”小结
把上面的组件串起来,一个典型 CNN 的数据流可以写成:
- 输入图像(H×W×C)
- 卷积(若干卷积核)→ 得到多张特征图
- ReLU(引入非线性)
- 池化(下采样、保留强响应)
- 重复“卷积+ReLU+池化”(逐层抽象)
- Flatten(展平)
- 全连接层(融合全局信息)
- 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)告诉我,我可以把本文进一步改成更贴合你视频内容的版本,并附上“对照式笔记”(视频段落 → 对应知识点)。







