Pytorch 中的池化层

1. 池化层

1. 介绍

池化层是深度学习网络中常用的一种层,用于对输入特征图进行下采样操作。池化层的主要目的是减小特征图的空间维度,从而降低模型的参数数量和计算量,同时增强模型对平移不变性的学习能力。

具体来说,池化层通过在输入特征图上滑动一个固定大小的窗口,根据窗口内的数值计算汇聚值,然后将其作为输出特征图的元素。

常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)

 2. 用途

池化层的主要用途有:

  1. 特征减小:池化层能够减小特征图的空间大小,减少网络参数和计算量,有助于降低模型的过拟合风险。

  2. 平移不变性:通过对输入特征图进行下采样,池化层能够提取出输入的主要特征,并对小的平移变化具有一定的不变性。

  3. 特征提取:池化层能够聚合局部特征,提取出输入特征图的主要信息,有助于网络学习更具有区分度的特征表示。

在卷积神经网络(Convolutional Neural Network, CNN)中,池化层通常与卷积层交替使用,可以构建深度网络模型,用于图像分类、目标检测、图像分割等计算机视觉任务中。通过不断堆叠池化层和卷积层,可以逐渐减小特征图的大小,增加感受野,提取出更高级别的语义信息。

 2. 常见的池化操作

1. 最大池化操作

torch.nn.MaxPool2d 是 PyTorch 中的一个池化层的类,用于在二维输入张量上执行最大池化操作。最大池化是一种降采样操作,它将输入张量分割成不重叠的区域网格,并用该区域内的最大值替换原始区域

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

torch.nn.MaxPool2d 类的构造函数具有以下参数:

  • kernel_size:指定池化窗口的大小。它可以是一个整数或一个包含两个整数的元组。如果只提供一个整数,则池化窗口的两个维度将具有相同的大小。
  • stride:指定池化操作的步长。它也可以是一个整数或包含两个整数的元组。如果不提供,它默认为 kernel_sizestride 一般不为1, 那样达不到 降维 的目的。
  • padding:指定在输入的每个维度上添加的填充量。如果不提供,它默认为 0。
  • dilation:指定内核元素之间的间距。如果不提供,它默认为 1。
  • return_indices:如果设置为 True,模块将同时输出最大值和这些最大值的索引。如果不提供,它默认为 False
  • ceil_mode:如果设置为 True,输入大小将除以步长并向上取整,而不是向下取整。如果不提供,它默认为 False

ceil_mode = True,那么不足 池化 时,仍然保留;

ceil_mode = False,那么不足 池化 时,不保留;

import torch
import torch.nn
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)

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

# 创建 module 实现最大池化
class MyModule(nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.maxpool = MaxPool2d(kernel_size=3,ceil_mode=False)

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

myModule = MyModule()
output = myModule(input)

"""
ceil_mode=True:
    tensor([[[[2., 3.],
              [5., 1.]]]])
ceil_mode=False:
    tensor([[[[2.]]]])
"""
print(output)

使用实例


                                     
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.tensorboard import SummaryWriter
import torchvision.datasets
from torch.utils.data import DataLoader



input = torchvision.datasets.CIFAR10("../TorchVersion/dataset",train=True,
                                     transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(input,batch_size=64)

class myModule(nn.Module):
    def __init__(self):
        super(myModule, self).__init__()
        self.maxpool = MaxPool2d(kernel_size=3,ceil_mode=False)

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

my_module = myModule()

write = SummaryWriter("logs")
step = 0

for data in dataloader:
    img, target = data
    write.add_image("Input",img,step,dataformats="NCHW")

    output = my_module(img)
    write.add_image("Output",output,step,dataformats="NCHW")

    step = step + 1

write.close()

结果:

2. 平均池化操作

class torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)

  • padding:输入的每一条边补充0的层数。可以是一个整数,表示在输入的每一条边上都相同的补充层数,或者是一个长度为2的元组,表示在两条边上的补充层数。默认值为0。
  • ceil_mode:当值为True时,进行上取整的操作,即向上取整得到输出大小;当值为False时,进行下取整的操作,即向下取整得到输出大小。默认值为False。
  • count_include_pad:当值为True时,在计算平均值时,包括padding的值;当值为False时,不包括padding的值。默认值为True。
  • divisor_override:用于覆盖默认的输出大小计算中的除数。默认值为None
pool = torch.nn.AvgPool2d(kernel_size=2, stride=2)
output = pool(input)

3. LP范数池化操作

LPPool2d是一种基于p范数的池化操作,用于计算特征图的局部稀疏表示。

class torch.nn.LPPool2d(norm_type, kernel_size, stride=None, ceil_mode=False

 

  • norm_type:表示范数的类型。可以是任意正数,表示 p 范数。默认值为 2。
  • kernel_size:池化窗口的大小。可以是一个整数,表示正方形的窗口,或者是一个元组,表示矩形的窗口。
  • stride:池化窗口的步幅。可以是一个整数,表示正方形窗口的步幅,或者是一个元组,表示矩形窗口的步幅。默认值为 None,表示使用与 kernel_size 相同的步幅。
  • ceil_mode:当值为 True 时,进行上取整的操作,即向上取整得到输出大小;当值为 False 时,进行下取整的操作,即向下取整得到输出大小。默认值为 False。

LPPool2d 是一种基于 p 范数的池化操作。它计算输入特征图的每个窗口的 p 范数,并将每个窗口的 p 范数的均值作为输出的值norm_type 为 1 时,它等价于 MaxPool2d 操作;当 norm_type 为 2 时,它等价于 AvgPool2d 操作

LPPool2d的计算公式如下:

output = (1/(kernel_size[0]*kernel_size[1])) * sum((|input|^p)^{1/p})

 其中,p为norm_type,|input|表示输入的绝对值。LPPool2d计算输入特征图的每个窗口的p范数,然后将每个窗口的p范数的均值作为输出的值。

3. 总结

最大池化是可以提取图像的纹理和形状特征,同时减少图像的大小。

平均池化可以平滑图像,减少噪声和细节,同时保留图像的整体结构。

L2范数池化在一些特定的应用中也会有一定的作用。

池化操作的目的是通过降低图像的空间维度,减少参数数量,简化模型,并且可以提取出图像的主要特征。池化层通常与卷积层交替使用,构建卷积神经网络(CNN)的架构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值