神经网络 torch.nn---Pooling layers(nn.MaxPool2d)

torch.nn --- PyTorch 2.3 documentation

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io)

nn.MaxPool2d

class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

参数介绍

  • kernel_size(int or tuple) - max pooling的窗口大小。用于设置一个取最大值的窗口,如设置为3,那么会生成一个3×3的窗口
  • stride(int or tuple, optional) - 默认值为kernel_size,步幅,和卷积层中的stride一样
  • padding(int or tuple, optional) - 填充图像,默认填充的值为0
  • dilation(int or tuple, optional) -- 一个控制窗口中元素步幅的参数。空洞卷积,即卷积核之间的距离。如卷积核的尺寸为3×3,dilation为1,那么返回一个大小为5×5的卷积核,卷积核每个元素与上下左右的元素之间空一格
  • return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助。一般用的很少
  • ceil_mode - 默认为False 。为True时,输出的shape使用ceil 格式(向上取整,即进一);为False时,输出的shape使用floor格式(向下取整)。

nn.MaxPool2d的作用

对于输入信号的输入通道,提供2维最大池化(max pooling)操作

如果输入的大小是(N,C,H,W),那么输出的大小是(N,C,H_out,W_out)和池化窗口大小(kH,kW)的关系是:

如果padding不是0,会在输入的每一边添加相应数目0
dilation用于控制内核点之间的距离,详细描述在这里

参数kernel_sizestride, paddingdilation数据类型: 可以是一个int类型的数据,此时卷积height和width值相同; 也可以是一个tuple数组(包含来两个int类型的数据),第一个int数据表示height的数值,tuple的第二个int类型的数据表示width的数值

操作前后的图像大小计算公式

参数说明:

  • N: 图像的batch_size

  • C: 图像的通道数

  • H: 图像的高

  • W: 图像的宽

计算过程:

shape:

input: (N,C_in,H_in,W_in)

output: (N,C_out,H_out,W_out)or(C_out,H_out,W_out)

看论文的时候,有些比如像padding这样的参数不知道,就可以用这条公式去进行推导

最大池化操作举例

假设有一个5×5的图像和一个3×3的池化核(kenel_size=3),如下图。池化过程就是将池化核与图像进行匹配。下面介绍最大池化的具体操作。

首先用池化核覆盖图像,如下图。然后取到最大值,作为一个输出。

上图为第一次最大池化操作,最大值为2。将2作为一个输出,如下图。

由于本例未对stride进行设置,故stride采取默认值,即stride=kernel_size=3 ,池化核移动如下图(移动方式与上上文中提到的卷积核移动方式相同,不再赘述)。由于池化核移动已超出范围,要不要取这3×2部分的最大值,取决于call_mode的值,若ceil_mode=True ,则取最大值,即输出3;若ceil_mode=False,则不取这部分的值,即这一步不进行池化操作。

假设ceil_mode=True,经过最大池化操作后,输出的结果如下图。

假设ceil_mode=False,经过最大池化操作后,输出的结果如下图。

最大池化的程序代码

示例1
python 复制代码
import torch
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]
], dtype=torch.float32)
print(input.shape)

input = torch.reshape(input, (-1, 1, 5, 5))

print(input.shape)

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

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

tudui = Tudui()
output = tudui(input)
print(output)

输出

示例2
python 复制代码
import torchvision
import torch
from torch import nn
from torch.nn import MaxPool2d

from torch.utils.data import Dataset, DataLoader
from torch.utils.tensorboard import SummaryWriter

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

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

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

tudui = Tudui()
writer = SummaryWriter('logs')

step = 1
for data in dataloader:
    imgs, target= data
    writer.add_images("input", imgs, step)
    output = tudui(imgs)
    writer.add_images("output", output, step)
    step += 1

writer.close()

对比输入输出,可以看出图像更糊了

相关推荐
Litluecat几秒前
2026年7月22日科技热点新闻
人工智能·科技·新闻·每日·速览
To_OC8 分钟前
别再傻傻分不清:Workflow 和 Agent 到底不是一回事
人工智能·agent·workflow
触底反弹28 分钟前
🔥 2026 大模型选择指南:别再只看 Benchmark 了,这些维度才是关键!
人工智能·面试
神奇霸王龙1 小时前
GB/T 46886 闭环屠夫:5 旗舰多模态 LLM 工业质检实测
人工智能·计算机视觉·ai·开源·ai编程·本地部署
南讯股份Nascent1 小时前
洽洽全域会员项目启动会圆满召开
大数据·人工智能
大郭鹏宇1 小时前
基于 LangGraph 构建智能分诊系统(一):项目概述与环境搭建
大数据·人工智能·microsoft·langchain
小林ixn1 小时前
大模型的“高考成绩单”:读懂Benchmark,选对真·生产力模型
人工智能·llm·测试
冬奇Lab1 小时前
AI 评测系列(04):RAG 评测——RAGAS 四指标实战与一个反直觉发现
人工智能·llm·agent
三声三视2 小时前
uni-app 鸿蒙端传参变成 [object Object]?顺着源码追到 ArkTS router 底层才搞明白
人工智能·ai·uni-app·aigc·ai编程·harmonyos
fthux2 小时前
“装闭”,让装修套路“装”不下去
人工智能·ai·开源·github·open source