16. 池化层的基本使用 -- nn.MaxPool2d
池化层的基本使 – nn.MaxPool2d
1. 为什么要使用池化层
-
池化层具有平移不变性,能够很好地适应图像数据中常见的像素平移现象
-
池化层主要分为最大池化层和平均池化层,提取数据特征的同时能够减少数据维度
- 最大池化:保留了数据中的显著特征
- 平均池化:保留数据中所有特征的均值
-
这里以二维最大池化为例
2. nn.MaxPool2d()的介绍
-
pytorch框架中提供了一维最大池化、二维最大池化、三维最大池化,对于图像数据来说应用最多的是二维最大池化,使用最多的设置参数为:
kernel_size, stride, ceil_mode,dilation, padding
from torch import nn pool = nn.MaxPool2d(kernel_size=2, stride=1, ceil_mode=True, padding=0, dilation=0)
kernel_size
、stride
以及dilation:
与卷积核中的使用方式完全相同,stride默认大小为kernel_sizepadding:
参数与卷积核中的含义相同,但是需要注意,padding 的每个维度要小于等于池化核每个维度的二分之一ceil_mode:
显然易见的一件事是,核按着stride设定的单位平移的过程中,且当stride不为1时,会遇到的一种情况是,剩余的卷积核未扫描到的元素,不足以满足核按着stride为单位的下一次移动,这时候可以进行两种操作方式ceil_mode=True:
表示继续移动,并且仅以核包裹的内容进行池化操作ceil_mode=False:
表示停止移动,直接放弃后续未扫描到的数据
3. 最大池化层的使用实例
-
加载数据集,使用
torchvision
中的数据集进行展示,并构建一个基本的DataLoader实例data = torchvision.datasets.CIFAR10( root= "./data_torchvision", train = False, transform=torchvision.transforms.ToTensor(), download=True ) dataloader = DataLoader(data, batch_size=64)
-
构建一个简单的神经网络基本框架
Model
,池化层一般添加在卷积层之后,在特征提取的基础上继续强化重要特征并减少数据维度class Model(nn.Module): def __init__(self): super(Model, self).__init__() self.conv = nn.Conv2d( in_channels=3, out_channels=3, kernel_size=3, stride=1, ) self.pool = nn.MaxPool2d(kernel_size=3, ceil_mode=True) def forward(self, x): y = self.pool(self.conv(x)) return y
-
通过该网络框架对图像数据进行池化操作,并使用
tensorboard
记录with SummaryWriter("log") as writer: step = 0 model = Model() for data in dataloader: imgs, labels = data writer.add_images("input", img_tensor=imgs, global_step=step) writer.add_images("output", img_tensor=model(imgs), global_step=step) step += 1
-
展示池化前后图像数据的变化情况
-
input
原始数据 -
output
池化后的数据
-