在卷积层提取出丰富的特征后,特征图的大小往往依然很大。为了减少计算量并提取最显著的特征,我们需要使用池化层(Pooling Layer)。其中最常用的就是"最大池化(Max Pooling)"。
1. 什么是最大池化?
最大池化(MaxPool)也被称为下采样(Downsampling)。
- 核心逻辑 :在输入图像上滑动窗口,在每个窗口区域内只保留最大值,丢弃其他值。
- 形象理解:就像看一部 1080P 的电影。经过池化,它变成了 720P 或 360P。虽然分辨率降低了,但电影的主要内容(特征)依然清晰可辨,且文件体积大大减小,播放更流畅。
2. 池化层的关键参数
,重点解析以下参数:
- kernel_size :池化窗口的大小(如
)。
- stride (步长) :窗口滑动的距离。注意:在池化层中,
stride的默认值通常等于kernel_size(这与卷积层默认步长为 1 不同)。 - padding:填充边缘。
- ceil_mode (向上取整):
-
- 如果设置为
True:当窗口滑动到边缘且剩余空间不足一个kernel_size时,依然保留该区域并取最大值。 - 如果设置为
False(默认):则舍弃该不完整区域。
- 如果设置为
3. 为什么需要池化层?
- 降维与加速:极大地减少了数据量和参数量,降低了显存占用,让计算更高效。
- 不变性(Invariance):最大池化让模型对图像的微小位移或形变不那么敏感。只要最强的那个特征信号还在窗口内,输出结果就是一样的。
- 防止过拟合:通过减少参数,一定程度上提高了模型的泛化能力。
4. 实战代码:矩阵的下采样
文件通过一个 5x5 的矩阵演示了池化如何将数据压缩为 3x3(当 ceil_mode=True 时):
Python
import torch
import torch.nn as nn
# 1. 定义 5x5 输入
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]], dtype=torch.float32).reshape(-1, 1, 5, 5)
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
# 定义 3x3 的最大池化,开启 ceil_mode
self.maxpool1 = nn.MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
return self.maxpool1(input)
tudui = Tudui()
output = tudui(input)
print(output)
5. 总结:卷积与池化的黄金搭档
- 卷积层 :负责发现特征(加法和乘法)。
- 池化层 :负责筛选特征(只取最大值)。
这种"卷积+池化"的组合,是现代计算机视觉模型的标准配置。