美文网首页
神经网络——最大池化层的使用

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

作者: 过气海豹 | 来源:发表于2021-10-04 20:32 被阅读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

    相关文章

      网友评论

          本文标题:神经网络——最大池化层的使用

          本文链接:https://www.haomeiwen.com/subject/cyhwnltx.html