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

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

相关推荐
A尘埃1 分钟前
深度学习之神经网络简介(FNN+CNN+RNN+LSTM+GRU+GAN+GNN+Transformer)
深度学习·神经网络
redreamSo3 分钟前
让AI Agent自动接Issue、写代码、上线:我用200行代码搭了一个全自动开发流水线
人工智能·开源·github
Cosolar10 分钟前
告别无脑循环:深入解析 ReWOO 与 Plan-and-Execute Agent 架构
人工智能·面试·全栈
Hector_zh14 分钟前
AI多租户平台的物理隔离方案实践与权衡
人工智能
啦啦啦_999923 分钟前
2. 分类问题的评估
人工智能·分类·数据挖掘
user298769827065429 分钟前
七、深入 Claude Code CLI 源码:斜杠命令系统详解
人工智能
纪伊路上盛名在37 分钟前
Accurate structure prediction of biomolecular interactions with AlphaFold 3
深度学习·阅读·文献·结构·蛋白质
KG_LLM图谱增强大模型1 小时前
Palantir 本体论与知识图谱深度分析及实现路径
人工智能·知识图谱
yzx9910131 小时前
项目名称:灵犀——基于大模型与知识图谱的全栈智慧创作与协同平台
人工智能·知识图谱
RAG专家1 小时前
【KG²RAG】结合知识图谱解决RAG 文本块孤立问题
人工智能·知识图谱·rag·检索增强生成