目录
池化层
最大池化层
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) 的关键组件,通过在输入特征图的局部非重叠区域(池化窗口)内选取最大值作为输出,实现特征筛选与维度压缩。其核心是保留局部区域内最显著的特征信号,同时降低特征图的空间分辨率。
核心参数
-
池化窗口尺寸(Kernel Size):
常用 2×2 或 3×3,决定局部特征的感知范围。窗口越大,压缩率越高,但可能丢失细粒度特征。 -
步长(Stride):
窗口滑动的步幅,通常与窗口尺寸一致(如 2×2 窗口对应步长 2),此时输出尺寸为输入的 1/2(沿高度和宽度)。 -
通道独立性:
池化操作在每个通道内独立进行,不跨通道融合(输出通道数与输入一致)。
功能与意义
-
维度缩减与计算效率提升:
通过降低特征图的 H×W 维度,减少后续网络层的参数量和计算量(如 2×2 池化可使特征图面积变为原来的 1/4)。 -
特征鲁棒性增强:
-
平移不变性:对输入特征的轻微位置偏移(如目标小幅移动)具有容错性(只要最大值仍在窗口内,输出不变)。
-
噪声抑制:通过选取局部最大值,过滤次要信息(如背景噪声),强化关键特征(如边缘、纹理的强响应区域)。
-
-
防止过拟合:
减少特征冗余,降低模型对局部细节的过度依赖,提升泛化能力。
简易解释:
最大池化可以理解成 “抓重点” 的操作,用一个生活化的例子就能说清楚:
假设你有一张照片(对应输入的特征图),现在用一个小方格(比如 2x2 的池化窗口)在照片上 “扫”—— 每次扫到一个方格,就只留下这个方格里最亮的那个点(取最大值),其他点都忽略;然后方格按固定步长(比如每次挪 2 格)移到下一个位置,重复同样的操作。
最后你会得到一张更小的照片:原来的细节少了,但保留了每个小区域里最突出的特征(比如最亮的色块、最明显的边缘)。
这么做的好处很简单:
- 照片变小了,后续处理起来更快(降维,减少计算量);
- 就算原照片里的物体稍微挪了一点位置(比如小方格稍微偏了点),只要最亮的点还在方格里,结果就不变(增强对位置变化的抗干扰能力)。
简单说,最大池化就是 “用最小的信息损失,把数据变小,同时抓住核心特征”。
MaxPool2d
参数:
tip:
Floor和Ceiling两个操作
简单来说,就是向上下取整
此处ceil和floor两个模式,表示池化核部分超出输入图像边界时候是否保留
池化后的形状大小:
最大池化操作图示
最大池化操作代码演示
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2dinput = 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 outputmodel = 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 SummaryWriterdataset = 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 outputmodel = Mymodule()
step = 0
writer = SummaryWriter("logs_test5")
for data in dataloader:imgs, targets = datawriter.add_images("input", imgs, step)output = model(imgs)writer.add_images("output", output, step)step += 1writer.close()