神经网络——最大池化层的使用

2021-10-04  本文已影响0人  过气海豹

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

上一篇下一篇

猜你喜欢

热点阅读