python神经网络编程入门(九)——CNN卷积核到底在“卷”什么?—— 局部感受野、权值共享与平移不变性?
📌 本文属于《Python神经网络入门:零基础保姆级路线图》专栏
上一篇:python神经网络编程入门(八)——全连接网络的“死穴“—— 为什么图像任务必须换思路,CNN?
下一篇:python神经网络编程入门(十)——CNN手撕卷积层(Conv2D)前向传播 —— 用 NumPy 实现滑窗与互相关运算完整目录 & 更新记录:
《Python神经网络入门:零基础保姆级路线图(附全系列免费源码)》
在第8篇里,我们拿着放大镜把全连接网络(MLP)的三大“死穴”看了个清清楚楚。用一句话帮你回忆一下:
一张 1000×1000 的灰度图,如果接到一个只有 1000 个神经元的全连接隐藏层,光第一层就要 10 亿个权重。而且,整张图的像素邻居关系被强行拆散,数字稍微挪个位置,网络当场蒙圈。
你可能会想:既然 MLP 这么不擅长图像,那我们该怎么办?直接把图片缩到很小行不行?或者用更深的网络硬扛行不行?
都不太灵——因为 MLP 的结构缺陷是刻在基因里的,修修补补解决不了根本问题。
这个时候,卷积神经网络(CNN)出现了,它是专门为图像而生的。
它没有发明什么高深莫测的黑科技,只是做了一件极其聪明的事:让网络看到该看的地方,而且用同一种眼光看全图。
今天这篇文章,我们就用三个核心思想——局部感受野、权值共享、平移不变性——来解锁 CNN 到底是怎么把第 8 篇的三个死穴一一破掉的。你放心,全程通俗易懂,没有吓人的公式,只有让你恍然大悟的“原来如此”。
1. 局部感受野:为什么只看“一小块”反而更聪明?
我们先从第 8 篇最扎心的场景说起。
1.1 从“全图通看”到“局部打光”
全连接网络对待图像的方式,就像一个班主任刚拿到新班级名单时,强迫自己把 50 个学生每个人的姓名、学号、各科成绩、家庭住址一字排开,揉成一整行,然后拼命找规律。
信息是很多,但乱成一锅粥,两件本来挨在一起的东西(比如同一个学生的各科成绩)被拆得老远。
CNN 说:别把整张图一口气读完,咱们一次只读一小块。
这个“一小块”在专业术语里叫 局部感受野(local receptive field)。
想象你拿着一个手电筒,在黑暗的屋子里只能照亮巴掌大小的一块地板。你要了解整间屋子的情况,就用手电筒从左到右、从上到下一寸一寸地扫过去,每次只观察被照亮的那一小片区域里的东西。

1.2 从参数爆炸到可控参数
全连接层的参数为什么爆炸?因为每一个输出神经元都要和所有输入像素相连。
比如:输入是 1000×1000 = 1,000,000 个像素,隐藏层有 1000 个神经元。
1,000,000 × 1000 = 10 亿个权重。这还只是一层。
但如果每个神经元只连接一小块区域呢?
假设我们规定每个神经元只看一个 10×10 的局部窗口。
那么一个神经元只需要 100 个权重。1000 个神经元也只需要 100×1000 = 10 万个参数。
10 亿 vs 10 万——一万倍的差距!
这还没完。10×10 这个窗口,在整张图上从左滑到右、从上滑到下,一共会滑动多少次?
我们暂时不纠结具体数字,你先记住这种感觉:把“全图全连接”变成“局部窗口滑动”,参数一下子就从天文数字变得可控了。
1.3 保留空间结构
局部感受野除了砍掉海量参数之外,还有一个更深的礼物:空间结构被保留了。
全连接层把图像拉成一维向量时,就仿佛把一幅拼图全部拆成单块,然后扔进一个大袋子里用力摇晃——相邻的两块从此天各一方。
而局部感受野呢?它每次选取图像上相邻的一小片矩形区域,一个 10×10 的小方块内部,像素之间的上下左右邻居关系完好无损。
网络第一层就能直接学到“这里有一个横边”、“那里有一个竖角”。这恰恰是我们希望模型学会的基础视觉特征。
你可以这样理解: 全连接层是先毁掉空间结构,再从碎片里强行找规律;CNN 则是先保留空间结构,再用更精巧的方法提取特征。高下立判。

局部感受野已经把第一个痛点(参数爆炸、空间结构破坏)给摁住了。但你可能注意到了:如果每个神经元各看各的,参数是不是还很多?
比如刚才的例子里,一个 10×10 的感受野,10,000 个神经元就要 100 万个权重。虽然比 10 亿少了很多,但依然是个大数目,而且每个神经元学的东西彼此孤立,太浪费了。
于是第二个王牌登场了:权值共享。
2. 权值共享:一个探测器扫遍全图
2.1 为什么不能让所有神经元用同一组权重?
回到手电筒的类比。假如你要在这间屋子里找“直角形状的桌角”,你走到左上角,用手电筒照一下,判断是不是桌角;然后向右挪一步,再照一下,判断是不是桌角……
你会不会每换一个位置就换一套判断标准?当然不会。判断“什么是桌角”的规则是固定的,不管手电筒照到哪儿,规则都一样。
全连接 + 局部感受野的方案,恰恰是每滑动一次,就换一套全新的规则。这就好比你在每个位置都要重新学习“桌角是什么”,纯属浪费。
CNN 的解决方案简单到让人拍大腿:让同一个局部感受野里的权重参数,在整张图上完全共享。
也就是说,我们定义好一个“探测器”(通常叫卷积核,也叫滤波器),然后用这同一个探测器从左到右、从上到下把整张图扫描一遍。
2.2 参数暴跌的魔法
我们再用 1000×1000 的图像来算一次账。
-
原始全连接:10 亿参数(前面算过)。
-
只加局部感受野(10×10):1000 个神经元 × 100 权重/神经元 = 10 万参数。
-
局部感受野 + 权值共享:只需要同一个卷积核的参数,即 10×10 = 100 个权重。
你当然可以多用几个不同的卷积核(比如用 6 个、16 个),每个检测不同的特征(横边、竖边、斜边、角点……),那参数量也不过是 100 × 核个数。核心在于,参数量不再和图像尺寸、神经元数量挂钩,完全取决于卷积核的大小和个数。
十万个参数已经算少了,但 100 个参数基本上就是个“迷你模型”。CNN 用这么一点点参数,就能在整张大图上提取有效特征,效率高得离谱。
这就是“卷”字的来源:
用同一个卷积核,在图像上不断滑动,每个位置都做一次“内积”运算,生成一张新的“特征图”。这个操作就叫卷积。整个网络就是用一堆卷积核“卷”出各种特征图,再层层叠加。

2.3 权值共享的附加礼包:自动提取同类特征
因为同一套权重扫遍全图,它检测的特征也是位置无关的。
比如你定义了一个“竖边检测器”的卷积核,它不管竖边出现在图片左边、中间还是右边,都能被同一个卷积核抓到。这不但让网络极其高效,也自然而然地为解决“平移不变性”铺好了路。
那我们接下来就把这个问题讲透。
3. 平移不变性:为什么 CNN 对位置偏移“免疫”?
第 8 篇我们举过一个非常生动的例子:
一张手写数字“5”稍微向左偏移几个像素,全连接网络就可能直接翻车。
原因已经分析过了——拉直向量后,所有像素的位置坐标被固化,偏移就意味着向量的值发生了全局错位,网络学到的权重“对不上号”。
CNN 却对平移表现出了惊人的容忍度。这不是魔法,而是局部感受野 + 权值共享 + 池化共同作用的结构性结果。
3.1 卷积阶段:特征探测器追着目标跑
假设你用一个 3×3 的卷积核检测“横线”,卷积核会在整个图像上滑动。
如果数字“5”平移了一点点,它所包含的那段横线也会跟着移动到相邻的位置。对于卷积核而言,它无非就是在新的位置再次检测到了同样的横线,生成的 feature map(特征图)上,那个“高激活”的区域也会相应地平移过去。
换句话说,输入漂移多少,特征图上的激活也跟着漂移多少,但特征本身不会消失。
这和全连接网络的“错位后对不上”是完全不同的逻辑。

3.2 池化层:把“差不多位置”压成同一个
CNN 一般还会在卷积层后面接一个池化层(比如最大池化,后面会将)。
它干的事情也非常简单:把一个局部小窗口(比如 2×2)里的最大值取出来,扔掉具体位置。于是,特征图中“那个激活很强的东西”只要还在这个 2×2 的小格子里,具体偏左还是偏右一点,池化后的结果都一样。
这就进一步增强了平移不变性。即便特征漂移了 1~2 个像素,池化之后信号依然能保留下来,位置信息被适度模糊化,反而让模型更关注“有没有这个特征”,而不是“特征精确出现在第几行第几列”。
4. 三大痛点解决
现在,我们把第 8 篇的三大痛点摆出来,看看 CNN 是怎么用三招逐个击破的。
痛点 1:参数爆炸
✅ 解决方案:局部感受野 × 权值共享。
每个卷积核只保留感受野大小(如 3×3 = 9)个参数,核的数量也就几十到几百,和图像尺寸完全脱钩。
痛点 2:空间结构被摧毁
✅ 解决方案:局部感受野直接保留矩形块的邻居关系。
图像不再被拉成向量,而是以张量(宽度 × 高度 × 通道)的形式在网络中流动,每一层的特征图依然保持空间拓扑结构。
痛点 3:平移不变性缺失
✅ 解决方案:卷积的权值共享保证特征可以随目标移动而移动,池化层进一步把“大致位置”模糊化,使得网络关注特征的存在而非精准坐标。
这三点共同构成了 CNN 极其简洁而强大的特征提取流水线。
5. 下一站:亲手写出卷积运算的每一行代码
读到这里,你已经彻底弄懂了 CNN 为什么是为图像而生。
局部感受野让它不再瞎看全图,权值共享让它用极少参数把整张图扫个遍,平移不变性让它即使目标偏移也能稳如泰山。
这三板斧不难,难的是真正搞清楚:卷积核在图像上“滑动”时,底层到底发生了什么?
下一篇文章,我们就打开这个黑盒。我们会用纯 NumPy 手撕卷积层(Conv2D)的前向传播,用最直白的 for 循环模拟滑动窗口,一行一行算出卷积核与图像局部区域的“互相关”结果。
写完代码之后,我们还会和 PyTorch 的 F.conv2d 做一次硬碰硬的对比,验证咱们手工实现到底对不对。
现在,你可以先深吸一口气,感受一下:你已经从“为什么要换思路”走到了“新思路的核心是什么”,CNN 的大门已经彻底敞开。
下一站,撸起袖子写代码,咱们不见不散。
更多推荐



所有评论(0)