PyTorch中的池化层

引言

PyTorch中的池化层主要有Max Pooling和Average Pooling两种。这些层用于减少输出特征图中的空间维度,并且在卷积神经网络中广泛使用以减小模型的参数数量。

代码与使用方式

主要包含三个参数:

  1. Kernel Size:池化核的大小,通常为正方形,如(2, 2)、(3, 3)等。

  2. Stride:步幅,即池化核在输入张量上滑动的步长,默认为Kernel Size的一半,如(1, 1)、(2, 2)等。

  3. Padding:填充,用于将输入张量补零以便计算输出大小。通常在池化层中使用padding时,采用的是全零填充(zero-padding)。

和卷积类似,池化也是用池化核在图片上滑动并计算。算出池化核所在区域的最大值或平均值,并赋值给output矩阵,这个output矩阵就是精简过后的数据。

1.Max Pooling(最大池化):

Max Pooling是通过选取输入张量每个区域内最大值来减小其尺寸的运算。

例如,如果是2x2的Max Pooling,它会考虑输入张量的每个2x2划分区域,然后选择其中的最大值作为输出。这样可以减少输出空间的维度以及计算量。

在PyTorch中,可以使用nn.MaxPool2d来实现Max Pooling层。

使用方式如下:


import torch
import torch.nn as nn

# 定义一个2x2的Max Pooling层
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)

# 输入张量
x = torch.Tensor([[[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]]])

# 进行Max Pooling
out = max_pool(x) 

# 输出结果
print(out)

2.Average Pooling(平均池化):

Average Pooling是通过选取输入张量每个区域内的平均值来减小其尺寸的运算。

与Max Pooling类似,如果使用2x2的Average Pooling,则会计算输入张量的每个2x2划分区域的平均值作为输出。

在PyTorch中,可以使用nn.AvgPool2d来实现Average Pooling层。

使用方式如下:


import torch
import torch.nn as nn

# 定义一个2x2的Average Pooling层
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)

# 输入张量
x = torch.Tensor([[[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]]])

# 进行Average Pooling
out = avg_pool(x) 

# 输出结果
print(out)

实际使用方式:

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

dataset = torchvision.datasets.CIFAR10("../DATA",train = False, download= False,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=50)

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

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

mynn = Mynn()

writer = SummaryWriter("logs_maxpool")
for i,data in enumerate(dataloader):
    imgs,target = data
    writer.add_images("input",imgs,i)
    output = mynn(imgs)
    writer.add_images("output",output,i)

writer.close()

测试数据为pytorch官方提供的CFAR10数据

dataset = torchvision.datasets.CIFAR10("../DATA",train = False, download= False,transform=torchvision.transforms.ToTensor())

并加载数据,以50张图片为一组进行遍历

dataloader = DataLoader(dataset,batch_size=50)

定义模型Mynn

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

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

这段代码定义了一个名为Mynn的自定义模型,该模型包含了一个使用nn.MaxPool2d()实现的Max Pooling层,池化核大小为3x3,且设置ceil_mode=True,即向上取整。

同时,该模型继承自nn.Module类,并实现了forward()函数,用于指定输入张量的前向计算流程。在该模型中,输入张量通过Max Pooling层进行池化操作,并将结果作为输出返回。

使用TensorBoard的SummaryWriter来可视化Mynn模型的输出结果。

mynn = Mynn()

writer = SummaryWriter("logs_maxpool")
for i,data in enumerate(dataloader):
    imgs,target = data
    writer.add_images("input",imgs,i)
    output = mynn(imgs)
    writer.add_images("output",output,i)

writer.close()

主要用了一个枚举遍历的方式对测试数据中的每一组数据都进行了mynn(也就是我们刚刚自定义的池化操作)池化操作。

最后结果为

 

 可以发现每张图片的像素点减少了,也就是说数据被精简了。

猜你喜欢

转载自blog.csdn.net/m0_50317149/article/details/131004876
今日推荐