news 2026/5/23 1:01:08

14 从 MLP 到 LeNet:卷积后为什么还要池化?一文讲清下采样保留了什么、又丢掉了什么

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
14 从 MLP 到 LeNet:卷积后为什么还要池化?一文讲清下采样保留了什么、又丢掉了什么

卷积后为什么还要池化?一文讲清下采样保留了什么、又丢掉了什么

很多人学卷积神经网络时,对卷积层还能勉强建立一点直觉:

  • 卷积核在图像上滑动
  • 每个位置得到一个响应值
  • 最后形成特征图

但一到池化层,很多人就开始懵了:

  • 池化层是不是只是把图缩小?
  • 下采样到底在保留什么?
  • 既然它会丢信息,为什么网络里还总要加它?
  • 它和卷积层到底怎么分工?
  • 这些内容和后面要讲的 LeNet 又有什么关系?

如果这些问题没想清楚,池化层就很容易被学成一句空话:

“哦,池化嘛,就是把特征图变小。”

这当然不算错,但远远不够。

这篇文章就专门把池化层讲清楚,不只讲“怎么做”,而是重点讲:

  1. 池化层到底在干嘛
  2. 下采样到底保留了什么
  3. 下采样又丢掉了什么
  4. 为什么这种“丢失”有时反而是好事
  5. 它和 LeNet 的结构到底怎么对应起来

一、池化层到底在干嘛?先用一句话说清楚

可以把池化层理解成:

在已经得到的特征图上,再做一次更粗粒度的信息保留。

卷积层更像是在图像局部区域里找模式,得到特征图。
而池化层通常不会再去重新找新特征,而是对这些已经出现的响应做一次整理和压缩:

  • 保留更有代表性的局部信息
  • 同时减小空间尺寸
  • 让后续网络更容易处理

所以池化层的重点,不只是“把图变小”,而是:

把特征图压缩成一个更紧凑的表示。


二、什么叫下采样?其实就是把特征图“压小”

“下采样”这个词,说白了就是:

把原来比较大的特征图,变成更小的一张图。

比如原来是 4×4 的特征图,经过一个 2×2 的池化窗口后,可能变成 2×2。

它做的事情其实很朴素:

  1. 取一个小区域
  2. 用某种规则把这个小区域压成一个值
  3. 再移动到下一个区域
  4. 重复这个过程
  5. 最后得到一张更小的输出图

所以“下采样”并不是神秘操作,本质上就是:

用更少的位置,去概括原来更细的局部信息。


三、最大池化和平均池化,到底有什么区别?

池化最常见的两种方式,就是:

1)最大池化(Max Pooling)

最大池化的规则非常简单:

在一个小区域里,只保留最大的那个值。

它的直觉可以理解成:

这个区域里最强的响应最重要。

如果某个模式在这个局部区域里特别明显,那最大池化会优先把它留下来。


2)平均池化(Average Pooling)

平均池化也很直观:

在一个小区域里,把这些值取平均。

它的直觉可以理解成:

这个区域整体的平均响应水平更重要。

相比最大池化,平均池化更关注“整体趋势”,而不是最强激活点。


四、先别急着上 toy 示例,直接用一张真实图片看看

这次不再用 4×4 或 15×15 的人工矩阵,直接用skimage自带的一张真实灰度图来演示。
这样更接近真实图像场景,也更容易看出池化到底对图像做了什么。

代码:读取真实图片

importnumpyasnpimportmatplotlib.pyplotaspltfromskimageimportdata img=data.camera().astype(float)plt.figure(figsize=(6,6))plt.imshow(img,cmap="gray")plt.title("原图")plt.axis("off")plt.show()print("原图 shape:",img.shape)

这段代码和前面卷积那篇保持一致:
图片进入程序之后,本质上还是一个二维数组,只不过这次不是人为构造的小矩阵,而是一张真实灰度图 [15]。


五、用代码看看:池化前后到底发生了什么

下面先写两个最基础的池化函数:

  • 2×2 最大池化
  • 2×2 平均池化
defmax_pooling_2x2(x):h,w=x.shape output=np.zeros((h//2,w//2))foriinrange(0,h,2):forjinrange(0,w,2):patch=x[i:i+2,j:j+2]output[i//2,j//2]=np.max(patch)returnoutputdefavg_pooling_2x2(x):h,w=x.shape output=np.zeros((h//2,w//2))foriinrange(0,h,2):forjinrange(0,w,2):patch=x[i:i+2,j:j+2]output[i//2,j//2]=np.mean(patch)returnoutput max_pooled=max_pooling_2x2(img)avg_pooled=avg_pooling_2x2(img)print("最大池化后 shape:",max_pooled.shape)print("平均池化后 shape:",avg_pooled.shape)

如果原图是 512×512,那么做一次 2×2 池化后,就会变成 256×256。

这就是最直观的下采样。


六、把原图、最大池化、平均池化放在一起看

只看数字还不够,直接把结果画出来最直观。

plt.figure(figsize=(14,5))plt.subplot(1,3,1)plt.imshow(img,cmap="gray")plt.title("原图")plt.axis("off")plt.subplot(1,3,2)plt.imshow(max_pooled,cmap="gray")plt.title("最大池化后")plt.axis("off")plt.subplot(1,3,3)plt.imshow(avg_pooled,cmap="gray")plt.title("平均池化后")plt.axis("off")plt.tight_layout()plt.show()

把这三张图放在一起看,会有几个很直观的现象:

  • 池化后图像尺寸变小了
  • 图像整体结构还在
  • 局部细节没有原图那么丰富了
  • 最大池化和平均池化的风格不一样

这里特别值得观察的是:

  • 最大池化更像在保留局部区域里最强的信号
  • 平均池化更像在保留局部区域整体的平均趋势

七、下采样保留了什么?保留的不是“所有信息”

这是理解池化层最关键的问题。

池化层真正保留下来的,不是“所有信息”,而是:

局部区域里更有代表性的响应。

对最大池化来说,保留的是

  • 一个小区域里最强的激活
  • 也就是“这里最明显的那个响应”

如果把它放到真实图片上去理解,可以想成:

这个局部窗口里最突出的像素响应,被优先保留下来了。


对平均池化来说,保留的是

  • 这个区域整体的平均响应水平

它不强调某一个点,而是强调整体。

所以如果从感觉上区分:

  • 最大池化更偏向“抓亮点”
  • 平均池化更偏向“看整体”

八、下采样又丢掉了什么?这些细节会被压缩掉

池化层一定会丢信息,这一点必须明确。

因为你把一个小区域压成一个值,本来就不可能把原来的细节全部保留下来。

池化层通常会丢掉这些东西:

1)更精细的位置关系

比如在一个 2×2 局部区域里:

  • 强响应在左上
  • 还是在右下

池化之后,这种更细的位置差异会被弱化。


2)较弱但可能有用的响应

最大池化特别明显。
它天然更关注“最大的那个值”,所以其他较弱响应可能会被忽略。


3)更高分辨率的局部细节

看真实图片尤其明显。
池化后,整体结构还在,但很多边缘细节、纹理细节、微小变化都会变得更粗糙。

所以可以把下采样的代价总结成一句话:

它保留了更粗粒度的重要信息,但牺牲了一部分细节。


九、既然丢信息,为什么池化层反而常常有用?

很多人一听“丢信息”,第一反应就是:这是不是坏事?

不一定。

因为模型并不总需要保留所有细节。
对于很多分类任务来说,更重要的不是某个模式精确出现在第几行第几列,而是:

  • 这个模式大概有没有出现
  • 它是不是足够明显
  • 它在某个局部区域里是不是存在

也就是说,模型有时候更关心“有没有”,而不是“像素级地在哪”。

这就是池化的价值:

它有意识地牺牲一部分细节,换来更紧凑、更稳定的表示。


十、卷积负责“找特征”,那池化到底负责什么?

这个地方很多人会混。

可以简单这么分:

卷积层更像在做

  • 发现模式
  • 提取局部特征
  • 生成特征图

池化层更像在做

  • 压缩特征图
  • 保留局部最重要的信息
  • 让表示更紧凑

所以池化层通常不是独立存在的,而是比较自然地接在卷积层后面。
卷积层负责“找特征”,池化层负责“压特征”。


十一、严格一点说:池化通常作用在“特征图”上,而不是原图上

前面为了把池化这件事讲直观,我们直接把真实灰度图拿来做了池化。
这在教学和可视化上完全没问题。

但如果从 CNN 的真实结构来说,更准确的表述应该是:

池化层通常接在卷积层后面,作用对象更常见的是卷积产生的特征图,而不是原始图片本身。

也就是说,真实网络里的流程通常更像这样:

原图 → 卷积层 → 特征图 → 池化层(下采样) → 更小的特征图

所以你现在看到的“图片池化效果”,更适合把它理解成:

  • 用真实图像先建立池化直觉
  • 再迁移到“真实网络里它是在特征图上做同样的事情”

这样理解会更顺。


十二、放到 LeNet 里看,池化层到底在起什么作用?

这个系列最终目标是LeNet 实战,那池化层就不是一个孤立知识点,而是在给 LeNet 铺路。

因为 LeNet 的前半部分,本质上就是把:

  • 卷积层
  • 池化层(下采样)
  • 再卷积
  • 再池化

按顺序组织起来,让一张图片从原始像素一步步变成更适合分类的表示。

也就是说:

  • 卷积层先把局部模式提出来
  • 池化层再把这些模式响应做一次压缩和整理
  • 最后网络再基于这些更紧凑的表示去做分类

所以你前面讲的“下采样到底保留了什么、又丢掉了什么”,放到 LeNet 里其实就是在回答:

LeNet 里的池化层具体在起什么作用?

答案就是:

它负责把卷积层已经提出来的局部模式响应压缩一下,保留更有代表性的局部信息,同时减小空间尺寸。

这和前面讲的下采样逻辑是一一对应的。


十三、顺便说一句:上采样又是什么,它和下采样是反过来的吗?

下采样是把特征图缩小。
那上采样就是把特征图放大。

但这里要注意:

上采样不是把下采样丢掉的细节完美恢复回来。

因为很多信息在下采样时已经被压缩掉了。
上采样更像是在:

  • 把较小的特征图放大
  • 恢复到更高的空间尺寸
  • 方便做更细致的输出

所以在分类网络里,下采样更常见;
而在图像分割、生成、重建这类任务里,上采样会更重要。


十四、如果只记一句话,池化层到底是什么?

可以先记这句:

池化层不是在重新找特征,而是在局部区域里,把卷积层已经找到的响应做一次压缩,尽量保留重要信息,同时减少空间尺寸。


十五、完整代码:真实图片 + 最大池化 + 平均池化

下面把这篇文章里用到的代码整理成一版可以直接运行的完整示例。

importnumpyasnpimportmatplotlib.pyplotaspltfromskimageimportdata# =========================# 1. 读取真实灰度图# =========================img=data.camera().astype(float)print("原图 shape:",img.shape)# =========================# 2. 定义池化函数# =========================defmax_pooling_2x2(x):h,w=x.shape output=np.zeros((h//2,w//2))foriinrange(0,h,2):forjinrange(0,w,2):patch=x[i:i+2,j:j+2]output[i//2,j//2]=np.max(patch)returnoutputdefavg_pooling_2x2(x):h,w=x.shape output=np.zeros((h//2,w//2))foriinrange(0,h,2):forjinrange(0,w,2):patch=x[i:i+2,j:j+2]output[i//2,j//2]=np.mean(patch)returnoutput# =========================# 3. 执行池化# =========================max_pooled=max_pooling_2x2(img)avg_pooled=avg_pooling_2x2(img)print("最大池化后 shape:",max_pooled.shape)print("平均池化后 shape:",avg_pooled.shape)# =========================# 4. 可视化# =========================plt.figure(figsize=(14,5))plt.subplot(1,3,1)plt.imshow(img,cmap="gray")plt.title("原图")plt.axis("off")plt.subplot(1,3,2)plt.imshow(max_pooled,cmap="gray")plt.title("最大池化后")plt.axis("off")plt.subplot(1,3,3)plt.imshow(avg_pooled,cmap="gray")plt.title("平均池化后")plt.axis("off")plt.tight_layout()plt.show()

认真看,才能开出差异,尴尬


十六、最后把池化层压缩成 5 句话

如果把池化层压缩成最关键的几个点,可以记住这些:

  1. 池化层最常见的作用是下采样
    也就是把特征图变小。

  2. 它保留的是局部区域里更有代表性的响应
    比如最大池化保留最强响应,平均池化保留整体平均水平。

  3. 它丢掉的是更细的位置关系和部分细节
    因为一个区域被压成一个值,信息不可能完整保留。

  4. 这种丢失不一定是坏事
    因为很多任务更关心“模式有没有出现”,而不是所有细节都完整保留。

  5. 这和 LeNet 是直接相关的
    LeNet 里的池化层,本质上就是在做这种下采样 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 1:01:08

OpenClaw+千问3.5-9B知识问答:搭建个人专属百科

OpenClaw千问3.5-9B知识问答:搭建个人专属百科 1. 为什么需要个人知识库助手 去年我接手了一个技术文档整理项目,需要从数百份PDF和网页中提取关键信息。手动操作不仅效率低下,还经常遗漏重要内容。这让我意识到:在信息爆炸的时…

作者头像 李华
网站建设 2026/5/16 0:04:37

OpenClaw小团队协作:Phi-3-mini-128k-instruct共享技能库的搭建方法

OpenClaw小团队协作:Phi-3-mini-128k-instruct共享技能库的搭建方法 1. 为什么我们需要共享技能库 去年我们团队开始尝试用OpenClaw做自动化办公,最初每个人都在自己的电脑上折腾不同的技能。很快问题就出现了:小王写了个自动整理周报的脚本…

作者头像 李华
网站建设 2026/4/20 22:48:26

OpenClaw安全实践:Qwen3.5-9B本地化部署防数据泄露方案

OpenClaw安全实践:Qwen3.5-9B本地化部署防数据泄露方案 1. 为什么需要关注OpenClaw的安全问题? 去年冬天,我在整理公司财报时突然意识到一个问题:如果让AI助手帮我处理这些敏感文件,数据会不会被意外上传到云端&…

作者头像 李华
网站建设 2026/5/3 17:13:24

2026-04-03期 AI最新资讯

2026年4月3日 AI资讯日报 每日精选人工智能领域最新动态,带你快速掌握技术突破、产品发布与行业趋势。🚀 技术突破 Meta 发布 Llama 4 系列开源大模型 Meta 今日正式推出 Llama 4 系列,包含三个版本:Llama 4 Mini、Llama 4 Base 和…

作者头像 李华
网站建设 2026/4/20 8:45:11

用VNA实测滤波器群时延:手把手教你避开IQ信号失真的坑(附校准技巧)

射频滤波器群时延实战:VNA测量技巧与IQ信号保真解决方案 在无线通信系统设计中,滤波器的群时延特性往往是被忽视的关键参数。许多工程师在评估滤波器性能时,主要关注插入损耗、带外抑制等传统指标,却忽略了群时延波动可能导致的信…

作者头像 李华