目录
老饼讲解:一步一步上手深度学习

【运算】细说一下CNN的池化运算

作者 : 老饼 发表日期 : 2025-10-12 20:30:23 更新日期 : 2026-05-20 14:35:23
老饼讲解-简单易懂,干货满满,爽过嗦螺!


好了,来说说CNN的池化运算,毕竟CNN就靠卷积和池化这两把刷子在玩。

一、CNN的池化运算

池化运算分为最大池化(max-pool)、均值池化(avg-pool)等等,但其实它们差异不大,我们理解一个,就理解全部了。好了,下面以均值池化为例,讲讲CNN的池化是如何运算的。

1.1. 池化运算例子

与卷积类似,池化也是以一个窗口对输入进行逐窗口计算,只是它是不带参数的。

不妨设输入X为:

下面以的池化窗口来对X进行均值池化,则有:

那它是怎么计算出来的呢,先来看第一步,如下:

2x2均值池化运算-Step-1

如图所示,用窗口从X的左上角部分开始,计算它的均值,就得到第一个输出3。

然后继续将窗口从左到右、从上到下逐步移动,就能得到均值池化运算的整体输出,如下:

均值池化-运算过程

1.2. 均值池化与最大池化

好了,均值池化与最大池化的运算都是差不多的,区别只是窗口运算时使用的是均值还是最大值。

均值池化与最大值池化

二、常用的池化运算与用途

好了,池化与卷积一样,都可以对输入进行填充(padding)、以及设置池化窗口移动的步幅。

在CNN中,池化使用得最多的是:填充0、步幅2的2×2池化,它的效果是可以令输入的Size减半,如下:

 2x2池化的效果

可以看到,、步幅为2的均值池化窗口,就是把输入的每像素进行平均,从而将输入信息压缩,达到降维,这是最常用的池化运算以及它的用途。

在实际中,往往会刻意在池化之前令输入的高、宽都是偶数,这样池化后高、宽就减半了,否则,就需要进行填充后再进行池化。

三、池化运算-代码实现

在pytorch中可以使用torch.nn.AvgPool2dtorch.nn.MaxPool2d来实现均值池化和最大值池化。

3.1. 均值池化-代码实现

在pytorch中,常用的均值池化(0填充)的实现代码如下:

# 本代码用于展示2*2均值池化计算
# 本代码来自《老饼讲解-深度学习》www.bbblearn.com
import torch
x = torch.tensor([[[1, 3,1,2],[2, 6,8,5],[4,2,1,0],[1,2,3,5]]],dtype=float)  # 生成输入数据
pool = torch.nn.AvgPool2d(2 ,stride= 2,padding=0)                            # 初始化一个2*2均值池化,步幅2,填充0
y  = pool(x)                                                                 # 对输入进行池化
print("池化的输入:",x)                                                       # 打印输入
print("池化的输出:",y)                                                       # 打印池化输出结果

运行结果如下:

池化的计算结果

可以看到,输出Size是输入Size的一半。

3.1. 最大值值池化-代码实现

在pytorch中,常用的均值池化(0填充)的实现代码如下:

# 本代码用于展示最大值池化计算
# 本代码来自《老饼讲解-深度学习》www.bbblearn.com
import torch
x = torch.tensor([[[1, 3,1,2],[2, 6,8,5],[4,2,1,0],[1,2,3,5]]],dtype=float)  # 生成输入数据
pool = torch.nn.MaxPool2d(2 ,stride= 2,padding=0)                            # 初始化一个最大值池化,步幅2,填充0
y  = pool(x)                                                                 # 对输入进行池化
print("池化的输入:",x)                                                       # 打印输入
print("最大值池化的输出:",y)                                                  # 打印池化输出结果

运行结果如下:

最大池化的结果

可以看到,最大值池化就是每一步都取池化窗口内的最大值。

总结

好了,总的来说,池化的目的就是让输入的维度降低,一般都是用、步幅为2的池化窗口,这样可以让输入的高、宽减半。需要注意的是,池化是面向每一个通道运算的,也就是有多少个输入通道,就有多少个输出通道哦,只要记住,它最原始的目的仅仅是对输入Size降维而已。



图标 评论
添加评论