1. 池化层
1. 介绍
池化层是深度学习网络中常用的一种层,用于对输入特征图进行下采样操作。池化层的主要目的是减小特征图的空间维度,从而降低模型的参数数量和计算量,同时增强模型对平移不变性的学习能力。
具体来说,池化层通过在输入特征图上滑动一个固定大小的窗口,根据窗口内的数值计算汇聚值,然后将其作为输出特征图的元素。
常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。
2. 用途
池化层的主要用途有:
特征减小:池化层能够减小特征图的空间大小,减少网络参数和计算量,有助于降低模型的过拟合风险。
平移不变性:通过对输入特征图进行下采样,池化层能够提取出输入的主要特征,并对小的平移变化具有一定的不变性。
特征提取:池化层能够聚合局部特征,提取出输入特征图的主要信息,有助于网络学习更具有区分度的特征表示。
在卷积神经网络(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_size
。stride 一般不为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)的架构。