You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CNN末端含全连接(FC)层时,如何实现空间不变性及不同位置物体识别?

为什么带全连接层的CNN能实现空间不变性?

这问题问得太戳痛点了——刚接触CNN的同学几乎都会疑惑:明明卷积核是滑动扫图的,天生带空间不变性,怎么到末端全连接层就好像“认死位置”了?其实空间不变性从来不是某一层单独搞定的,是整个CNN流水线协同作用的结果,咱一步步掰扯清楚:

  • 卷积层先把“位置信息”转化为“特征存在性”:卷积核是在整个图像上滑动计算的,不管狗在图像左上角还是右下角,只要狗的局部特征(比如尖耳朵、圆鼻子)出现在视野里,对应的卷积核就会被激活,在*特征映射(Feature Map)*上留下高亮的响应区域。这一步已经把“狗在哪个坐标”的问题,转化成了“图像里有没有狗的特征”的问题。

  • 池化层直接抹平位置的细微差异:几乎所有CNN都会在卷积层后加池化操作(比如最大池化(Max Pooling))。拿2x2的最大池化举例,它会把feature map里每一块小区域的最大值提取出来——也就是说,不管某个特征在这个小方块里的具体位置是左上还是右下,只要它存在,池化就会保留它的最强响应。这相当于直接把位置的微小偏移给“过滤”掉了,让后续层拿到的特征更聚焦于“有没有”,而非“在哪”。

  • 深层卷积的抽象特征彻底脱离具体位置:越往后的卷积层,提取的特征越抽象——从最开始的边缘、纹理,到中间的耳朵、脸部轮廓,再到深层的“狗的整体形态”。到了深层,feature map里的响应已经不再对应图像里的具体像素位置,而是对应“是否存在某类抽象特征组合”。比如不管狗是站着还是趴着,深层卷积都能识别出“有狗的头部特征+躯干特征”,这些组合的响应模式是高度一致的,和狗的位置无关。

  • 全连接层学的是“特征组合模式”,而非“位置索引”:当经过池化和抽象的feature map被拉平成一维向量喂给全连接层时,FC层学习的并不是“某个索引位置的神经元必须激活”,而是“哪些神经元的组合激活对应狗这个类别”。训练时,我们会喂给模型大量不同位置、姿态的狗样本,FC层在反向传播中会不断调整权重,最终学会忽略“特征在向量里的位置差异”,只关注“关键特征是否都存在”——只要代表狗的那些抽象特征对应的神经元都亮了,不管它们在向量里的位置怎么变,FC层都会输出“狗”的分类结果。

  • 数据增强给全连接层“打预防针”:实际训练中,我们还会用数据增强(随机裁剪、平移、翻转、缩放)生成各种位置、姿态的样本,强迫模型见过足够多的“位置变化”。这相当于提前给FC层训练了“抗干扰能力”,让它不会因为狗的位置变了就认不出来。

说白了,全连接层本身并不具备空间不变性,但前面的卷积+池化+深层抽象已经把输入转化成了与位置无关的特征组合,FC层只需要把这些组合和类别对应起来就行。整个流水线配合起来,就实现了“不管狗在哪、啥姿势,都能认出是狗”的效果。

内容的提问来源于stack exchange,提问作者James Howlett

火山引擎 最新活动