引言
PyTorch中的池化层主要有Max Pooling和Average Pooling两种。这些层用于减少输出特征图中的空间维度,并且在卷积神经网络中广泛使用以减小模型的参数数量。
代码与使用方式
主要包含三个参数:
-
Kernel Size:池化核的大小,通常为正方形,如(2, 2)、(3, 3)等。
-
Stride:步幅,即池化核在输入张量上滑动的步长,默认为Kernel Size的一半,如(1, 1)、(2, 2)等。
-
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(也就是我们刚刚自定义的池化操作)池化操作。
最后结果为
可以发现每张图片的像素点减少了,也就是说数据被精简了。