一、定义
池化层是深度学习中常用的一种层级结构,用于减少神经网络模型的参数数量,降低计算复杂度,同时提取输入数据的关键特征。它通常紧跟在卷积层之后,是卷积神经网络(CNN)中的一个重要组成部分。

池化层的主要作用是通过对输入数据进行降采样,减少数据的维度,同时保留最重要的特征。这有助于模型在一定程度上提高了泛化能力,同时降低了过拟合的风险。

池化层的操作通常有两种主要类型:

1、最大池化(Max Pooling): 这是最常见的池化操作之一。在最大池化中,池化窗口在输入数据上滑动,每次取窗口内的最大值作为输出。这样做的好处是保留了最显著的特征,同时丢弃了不重要的信息。

2、平均池化(Average Pooling): 在平均池化中,池化窗口在输入数据上滑动,每次取窗口内的平均值作为输出。这种方式在一些场景下也很有用,尤其是当模型需要更加平滑的特征表示时。

无论是最大池化还是平均池化,它们都有一个共同的参数,即池化窗口大小和步幅。池化窗口大小决定了每次池化操作覆盖的输入数据范围,而步幅则决定了池化窗口在输入数据上滑动的距离。

总的来说,池化层通过保留关键特征、降低数据维度、减少计算量等方式,为神经网络模型提供了更加高效和有效的特征表示,是深度学习中不可或缺的一部分。

二、池化层和卷积层的区别(滑动代表着什么)

1、卷积操作: 在卷积操作中,卷积核在输入图像上进行滑动,通过与输入图像的每个位置进行点乘并求和,从而计算出输出特征图的每个像素值。卷积核的参数是可学习的,它决定了卷积操作中提取的特征。卷积操作通常用于提取图像中的局部特征,例如边缘、纹理等。

2、池化操作: 在池化操作中,池化窗口在输入图像上进行滑动,但是池化操作不涉及可学习的参数。池化操作通常使用最大值或平均值等函数来计算池化窗口内的特征,并将其作为输出。池化操作的主要目的是降低数据的维度和复杂度,同时保留重要的特征。

所以,尽管卷积和池化操作都涉及对输入图像进行计算,但它们的计算方式和作用是不同的。卷积操作主要用于特征提取,而池化操作主要用于降低数据维度和复杂度。

三、pytorch实例(选自小土堆课程)
1、数据集选自pytorch中自带的数据集,代码如下所示:

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

2、设置池化层的参数,按住Ctrl+P可以显示参数。

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

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

3、使用tensorboard可视化结果

writer = SummaryWriter('./logs_maxpool')
step = 0
for data in dataload:
    imgs,targets = data
    output = use_maxpool(imgs)
    writer.add_images("input",imgs,step)
    writer.add_images("output",output,step)
    step = step+1

四、结果以及完整代码

1、结果(可以清楚看到最大池化将图像中最明显的特征提取出来了)

python池化技术 pytorch平均池化_人工智能


2、完整可运行代码

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

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

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

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

use_maxpool = function()

writer = SummaryWriter('./logs_maxpool')
step = 0
for data in dataload:
    imgs,targets = data
    output = use_maxpool(imgs)
    writer.add_images("input",imgs,step)
    writer.add_images("output",output,step)
    step = step+1

writer.close()