目录

池化层 

最大池化层

MaxPool2d

最大池化操作图示 

最大池化操作代码演示 

综合代码案例 


池化层 

池化层(Pooling Layer)

核心作用:通过降采样减少特征图尺寸,降低计算量,增强特征鲁棒性。

1. 常见类型

  • 最大池化(Max Pooling):提取局部区域最大值。

  • 平均池化(Average Pooling):计算局部区域平均值。

  • 全局池化(Global Pooling):将每个通道的特征图压缩为一个标量(常用于分类任务)。

2. 参数与计算

  • 窗口大小(Kernel Size):如 2×2、3×3。

  • 步长(Stride):窗口滑动的步长,通常等于窗口大小(如 2)。

  • 填充(Padding):边缘填充策略,保持输出尺寸。

MaxPool->下采样

MaxUnPool->上采样 

“池化层”(Pooling Layer)的命名源于其核心操作与 “池”(Pool)这一概念的类比 —— 就像从一个 “池子” 里提取所需内容,本质是对局部区域内的信息进行汇总、筛选并输出。

具体来说,“池” 在这里可理解为 “局部数据区域”:
池化层会将输入特征图划分为多个不重叠的小区域(比如 2×2 的窗口),每个小区域就像一个 “池子”;然后对每个 “池子” 里的所有数据(像素值或特征值)执行特定操作(最大池化取最大值、平均池化取平均值等),最终从每个 “池子” 里只输出一个结果。

这个过程就像从每个 “池子” 里 “提取” 出最具代表性的信息(比如最大池化提取 “最显著特征”,平均池化提取 “平均特征”),因此被形象地称为 “池化”。


最大池化层

 最大池化层是卷积神经网络(CNN)中用于下采样(Downsampling) 的关键组件,通过在输入特征图的局部非重叠区域(池化窗口)内选取最大值作为输出,实现特征筛选与维度压缩。其核心是保留局部区域内最显著的特征信号,同时降低特征图的空间分辨率。

核心参数

  1. 池化窗口尺寸(Kernel Size)
    常用 2×2 或 3×3,决定局部特征的感知范围。窗口越大,压缩率越高,但可能丢失细粒度特征。

  2. 步长(Stride)
    窗口滑动的步幅,通常与窗口尺寸一致(如 2×2 窗口对应步长 2),此时输出尺寸为输入的 1/2(沿高度和宽度)。

  3. 通道独立性
    池化操作在每个通道内独立进行,不跨通道融合(输出通道数与输入一致)。

功能与意义

  1. 维度缩减与计算效率提升
    通过降低特征图的 H×W 维度,减少后续网络层的参数量和计算量(如 2×2 池化可使特征图面积变为原来的 1/4)。

  2. 特征鲁棒性增强

    • 平移不变性:对输入特征的轻微位置偏移(如目标小幅移动)具有容错性(只要最大值仍在窗口内,输出不变)。

    • 噪声抑制:通过选取局部最大值,过滤次要信息(如背景噪声),强化关键特征(如边缘、纹理的强响应区域)。

  3. 防止过拟合
    减少特征冗余,降低模型对局部细节的过度依赖,提升泛化能力。

简易解释:

最大池化可以理解成 “抓重点” 的操作,用一个生活化的例子就能说清楚:

假设你有一张照片(对应输入的特征图),现在用一个小方格(比如 2x2 的池化窗口)在照片上 “扫”—— 每次扫到一个方格,就只留下这个方格里最亮的那个点(取最大值),其他点都忽略;然后方格按固定步长(比如每次挪 2 格)移到下一个位置,重复同样的操作。

最后你会得到一张更小的照片:原来的细节少了,但保留了每个小区域里最突出的特征(比如最亮的色块、最明显的边缘)。

这么做的好处很简单:

  • 照片变小了,后续处理起来更快(降维,减少计算量);
  • 就算原照片里的物体稍微挪了一点位置(比如小方格稍微偏了点),只要最亮的点还在方格里,结果就不变(增强对位置变化的抗干扰能力)。 

简单说,最大池化就是 “用最小的信息损失,把数据变小,同时抓住核心特征”。


MaxPool2d

 参数:

tip:

Floor和Ceiling两个操作

简单来说,就是向上下取整

 

此处ceil和floor两个模式,表示池化核部分超出输入图像边界时候是否保留 

池化后的形状大小:

  

最大池化操作图示 

最大池化操作代码演示 

import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d

input = torch.tensor([
    [1, 2, 0, 3, 1],
    [0, 1, 2, 3, 1],
    [1, 2, 1, 0, 0],
    [5, 2, 3, 1, 1],
    [2, 1, 0, 1, 1]
])
print(input.shape)
"""
打印结果:
torch.Size([5, 5])
不符合卷积层的输入要求
在最简单的情况下,输入尺寸为 (N,C,H,W)
N:批量数
C:通道数
H:高度
W:宽度
"""
input = torch.reshape(input, (1, 1, 5, 5))


class Mymodule(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = MaxPool2d(kernel_size=3, ceil_mode=True)

    def forward(self, input):
        output = self.maxpool(input)
        return output


model = Mymodule()
output = model(input)
print(output)

  Ceil_model=True时

 Ceil_model=False时 


综合代码案例 

import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10("../torchvision_dataset", train=False,
                                       transform=torchvision.transforms.ToTensor(),
                                       download=True)
dataloader = DataLoader(dataset, batch_size=64)


class Mymodule(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = MaxPool2d(kernel_size=3, ceil_mode=True)

    def forward(self, input):
        output = self.maxpool(input)
        return output


model = Mymodule()
step = 0
writer = SummaryWriter("logs_test5")
for data in dataloader:
    imgs, targets = data
    writer.add_images("input", imgs, step)
    output = model(imgs)
    writer.add_images("output", output, step)
    step += 1

writer.close()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐