神经网络——最大池化层的使用
1 池化的目的
实施池化的目的:(1) 降低信息冗余;(2) 提升模型的尺度不变性、旋转不变性;(3) 防止过拟合。
2 常见的池化类型
池化层的常见操作包含以下几种:最大值池化,均值池化,随机池化,中值池化,组合池化等。
其中更为常用的池化方法是最大池化(max-pooling)和均值池化(mean-pooling)。
3 最大池化的特点
1 最大池化(max-pooling)即取局部接受域中值最大的点。
2 最大值池化的优点在于它能学习到图像的边缘和纹理结构。
3 根据相关理论,特征提取的误差主要来自两个方面:
(1)邻域大小受限造成的估计值方差增大;
(2)卷积层参数误差造成估计均值的偏移。
一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。与mean-pooling近似,在局部意义上,则服从max-pooling的准则。
4 最大池化卷积核的设置
max-pooling卷积核的大小一般是2×2。 非常大的输入量可能需要4x4。 但是,选择较大的形状会显着降低信号的尺寸,并可能导致信息过度丢失。 通常,不重叠的池化窗口表现最好。
5 实战一 —— 输入tensor观察池化层的作用
import torch
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))
print(input.shape)
class Linyu(nn.Module):
def __init__(self):
super(Linyu,self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
def forward(self,input):
output = self.maxpool1(input)
return output
linyu = Linyu()
output = linyu(input)
print(output)
输出:
torch.Size([1, 1, 5, 5])
tensor([[[[2.]]]])
若将self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)中ceil_mode=True,
则输出:
torch.Size([1, 1, 5, 5])
tensor([[[[2., 3.],
[5., 1.]]]])
6 实战二 —— 最大池化在图像处理中的使用
import torch
from torch import nn
from torch.nn import MaxPool2d
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("../dataset",train=False,transform=torchvision.transforms.ToTensor(),download=False)
dataloader = DataLoader(dataset=dataset,batch_size=64,drop_last=False)
class Linyu(nn.Module):
def __init__(self):
super(Linyu,self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
def forward(self,input):
output = self.maxpool1(input)
return output
linyu = Linyu()
writer = SummaryWriter("../logs/P15_logs")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input",imgs, step)
output = linyu(imgs)
writer.add_images("output",output, step)
step = step + 1
writer.close()
使用tensorboard --logdir=logs/P15_logs命令打开tensorboard
maxpooling参考资料:
1.https://zhuanlan.zhihu.com/p/77040467
2.https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E6%B1%A0%E5%8C%96/22692585?fr=aladdin
3.https://www.bilibili.com/video/BV1hE411t7RN?p=19