神经网络 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()

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

相关推荐
武子康6 小时前
调查研究-140 全球机器人产业深度调研报告【02篇】:全球机器人产业格局分析:五个阶段并存与商业化路径 2026
人工智能·ai·机器人·具身智能·智能化
木心术16 小时前
Windows系统下MySQL与AI工具集成方案:数据存储与调用实践
人工智能·windows·mysql
a752066286 小时前
OpenClaw企业微信渠道配置教程|API模式+长连接+全部授权
人工智能·机器人·企业微信·openclaw部署·小龙虾一键安装
AI语宙漫游指南6 小时前
AI Agent Skill 系统架构全解析:SKILL 规范与框架实现
人工智能·agent
一楼的猫6 小时前
从文本特征分析看网文平台AI检测:3个被忽视的指标
开发语言·人工智能·学习方法·ai编程·ai写作·ai自动写作
初心未改HD6 小时前
深度学习之LSTM与GRU门控循环单元详解
深度学习·gru·lstm
传说故事6 小时前
【论文阅读】GEN-0: Embodied Foundation Models That Scale with Physical Interaction
论文阅读·人工智能·机器人·具身智能
嗝o゚6 小时前
昇腾CANN ops-transformer 仓的 FlashAttention 算子:昇腾NPU上的注意力加速实现
人工智能·深度学习·transformer
35岁程序员的自救之路6 小时前
AiBBS - 面向下一个十年的AI + 云原生社区系统
人工智能·云原生
云烟成雨TD6 小时前
Spring AI Alibaba 1.x 系列【58】Spring AI Alibaba Builtin Nodes 模块介绍
java·人工智能·spring