首页 > 其他分享 >深度学习(九)——神经网络:最大池化的作用

深度学习(九)——神经网络:最大池化的作用

时间:2023-07-21 19:11:58浏览次数:49  
标签:torch ceil 神经网络 池化 mode 深度 input size

一、 torch.nn中Pool layers的介绍

官网链接:

https://pytorch.org/docs/stable/nn.html#pooling-layers

1. nn.MaxPool2d介绍

nn.MaxPool2d是在进行图像处理时,Pool layers最常用的函数

官方文档:MaxPool2d — PyTorch 2.0 documentation

(1)torch.nn.MaxPool2d类

class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

(2)参数介绍

  • kernel_size(int or tuple): 用于设置一个取最大值的窗口,如设置为3,那么会生成一个3×3的窗口

  • stride(int or tuple): 默认值为kernel_size,步幅,和卷积层中的stride一样

  • padding(int or tuple): 填充图像,默认填充的值为0

  • dilation(int): 空洞卷积,即卷积核之间的距离。如卷积核的尺寸为3×3,dilation为1,那么返回一个大小为5×5的卷积核,卷积核每个元素与上下左右的元素之间空一格

  • return_indices(bool): 一般用的很少,不做介绍

  • ceil_mode(bool): 默认为False。为True时,输出的shape使用ceil格式(向上取整,即进一);为False时,输出的shape使用floor格式(向下取整)。

二、最大池化操作

1. 最大池化操作举例(理论介绍)

假设有一个5×5的图像和一个3×3的池化核(kenel_size=3),如下图。池化过程就是将池化核与图像进行匹配。下面介绍最大池化的具体操作。

  • 首先用池化核覆盖图像,如下图。然后取到最大值,作为一个输出。

  • 上图为第一次最大池化操作,最大值为2。将2作为一个输出,如下图。

  • 由于本例未对stride进行设置,故stride采取默认值,即stride=kernel_size=3,池化核移动如下图(移动方式与上上文中提到的卷积核移动方式相同,不再赘述)。由于池化核移动已超出范围,要不要取这3×2部分的最大值,取决于call_mode的值,若ceil_mode=True,则取最大值,即输出3;若ceil_mode=False,则不取这部分的值,即这一步不进行池化操作。

    • 假设ceil_mode=True,经过最大池化操作后,输出的结果如下图。

    • 假设ceil_mode=False,经过最大池化操作后,输出的结果如下图。

2. 操作前后的图像大小计算公式

跟卷积操作的计算公式一样。具体如下:

参数说明:

  • N: 图像的batch_size

  • C: 图像的通道数

  • H: 图像的高

  • W: 图像的宽

计算过程:

  • Input:\( (N,C_{in}​,H_{in}​,W_{in}​)\) or \((C_{in}​,H_{in}​,W_{in}​)\)

  • Output: \((N,C_{out}​,H_{out}​,W_{out}​)\) or \((C_{out}​,H_{out}​,W_{out}​)\)

    • 其中有:

      \(H_{out}​=⌊\frac{H_{in}​+2×padding[0]−dilation[0]×(kernel\_size[0]−1)−1​}{stride[0]}+1⌋\)

      \(W_{out}​=⌊\frac{W_{in}​+2×padding[1]−dilation[1]×(kernel\_size[1]−1)−1​}{stride[1]}+1⌋\)

看论文的时候,有些比如像padding这样的参数不知道,就可以用这条公式去进行推导

3. 最大池化操作代码举例

依然选取上面的例子,进行编程。

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)   #输入图像数据;与卷积操作不同的是,最大池化操作要求输入的图像数据是浮点数,而不是整数(为整数第23行会报错)
input=torch.reshape(input,(-1,1,5,5))     #构造图像数据,使其符合输入标准,即分别为(输入batch_size待定,1通道,大小为5×5)
print(input.shape)  #[Run] torch.Size([1, 1, 5, 5]);数据格式符合输入标准

#构造神经网络
class Demo(nn.Module):
    def __init__(self):
        super(Demo,self).__init__()
        self.maxpool1=MaxPool2d(kernel_size=3,ceil_mode=True)  #设置最大池化函数,这里以ceil_mode=True为例

    def forward(self,input):
        output=self.maxpool1(input)  #将输入的数据(input)进行最大池化草子哦
        return output

demo=Demo()  #创建神经网络
output=demo(input)
print(output)
"""
[Run]
tensor([[[[2., 3.],
          [5., 1.]]]])

符合前面ceil_mode=True例子的输出结果一致
"""

4. 为什么要进行最大池化(最大池化的作用)

  • 最大程度地保留输入特征,并使数据量减小

  • 上述例子中输入图像为5×5,经过最大池化操作之后变成了3×3,甚至为1×1。使得图像特征得以保留,而数据量大大减少了,对整个网络来说参数减少了,运算速度也变快了

  • 打个比方,这就像看视频的时候,高清(输入图像)变(经过最大池化操作)标清(输出数据)

使用具体图片示例,介绍最大池化的作用:

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,download=True,transform=torchvision.transforms.ToTensor())
dataloder=DataLoader(dataset,batch_size=64)

#构造神经网络
class Demo(nn.Module):
    def __init__(self):
        super(Demo,self).__init__()
        self.maxpool1=MaxPool2d(kernel_size=3,ceil_mode=True)  #设置最大池化函数,这里以ceil_mode=True为例

    def forward(self,input):
        output=self.maxpool1(input)  #将输入的数据(input)进行最大池化草子哦
        return output

demo=Demo()  #创建神经网络

writer=SummaryWriter("logs_maxpool")
step=0

for data in dataloder:
    imgs,targets=data
    writer.add_images("input",imgs,step)
    output=demo(imgs)
    writer.add_images("output",output,step)
    step+=1
writer.close()

对比输入输出,可以看出图像更糊了

标签:torch,ceil,神经网络,池化,mode,深度,input,size
From: https://www.cnblogs.com/zoubilin/p/17572233.html

相关文章

  • 算网深度融合成趋势,天翼云让政企上云更安全、更便捷!
    7月12日,由中国通信标准化协会算网融合产业及标准推进委员会(CCSATC621)组织召开的“2023年算网融合产业发展峰会-SD-WAN产业发展论坛”在北京召开,论坛旨在进一步凝聚SD-WAN发展共识,面向产业数字化需求,探讨SD-WAN技术演进与产业发展趋势。会上,天翼云荣膺“2022年度SASE最/佳应用奖”......
  • 【第2周】卷积神经网络
    一、代码练习importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsimportmatplotlib.pyplotaspltimportnumpy#一个函数,用来计算模型中有多少参数defget_n_params(model):......
  • 卷积神经网络不同优化器
    实现卷积神经网络不同优化器简介卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种广泛应用于图像处理和计算机视觉任务中的深度学习模型。在训练过程中,我们通常会使用优化器(Optimizer)来自动调整网络的权重和偏置,以最小化损失函数。本文将介绍如何使用不同的优化器来训练卷积......
  • 遗传算法 深度学习
    遗传算法与深度学习1.遗传算法和深度学习的概述遗传算法和深度学习是两种不同的优化算法,它们在解决问题时有着不同的应用场景和方法。遗传算法是一种通过模拟生物进化过程中的自然选择和遗传机制来寻找最优解的优化算法。而深度学习则是一种通过神经网络模型来学习和识别复杂的......
  • MATLAB train 神经网络 函数
    MATLABtrain神经网络函数神经网络是一种用于模拟人脑神经系统的数学模型,它由大量的神经元和连接它们的权重组成。MATLAB是一个功能强大的数学计算软件,提供了丰富的工具箱和函数,用于神经网络的设计和训练。其中train函数是MATLAB中用于训练神经网络的重要函数之一。train函数的......
  • U-Net神经网络总体结构
    实现U-Net神经网络总体结构1.简介U-Net是一种用于图像分割的神经网络结构,在医学领域的图像分析中得到广泛应用。它的结构独特,可以实现高精度的图像分割任务。本文将介绍U-Net的总体结构以及每一步的代码实现。2.U-Net总体结构U-Net的总体结构可以分为两个部分:编码器(En......
  • 脉冲神经网络理论基础(1)
    神经元的基本结构(高中生物x)图源wiki。接收区(receptivezone):为树突(dendrite)到胞体(soma)的部分。在计算建模时,往往把树突作为接受区看待。树突接受突触前神经元的信号,在ANN结构中表现为当前神经元接受前一层的输入,并以突触的权重进行加权和。触发区(triggerzone):为细胞体与轴突交......
  • 卷积神经网络
    ConvolutionalNeuralNetwork(CNN卷积神经网络)解释一应用于Imageclassification(图像分类)一张图片如何作为一个模型的输入:一张图片可以当成三维的Tensor(维度大于等于2的矩阵),三维分别代表图片:宽、高、channels(宽高代表像素,channels代表RGB三色) 参数过多,模型弹......
  • matlab怎么使用BP神经网络知乎
    使用BP神经网络解决二分类问题问题描述假设我们有一个数据集,其中包含一些二维点的坐标和它们对应的标签。我们想要训练一个神经网络来对新的点进行分类,即判断它们属于哪个类别。解决方案为了解决这个问题,我们可以使用BP神经网络。BP神经网络是一种经典的人工神经网络,通过反向传......
  • 深度学习 -- 系列文章
    深度学习(八)——神经网络:卷积层深度学习(七)——神经网络的卷积操作深度学习(六)——神经网络的基本骨架:nn.Module的使用深度学习(五)——DatadLoader的使用深度学习(四)——torchvision中数据集的使用深度学习(三)——Transforms的使用深度学习(二)——TensorBoard的使用深......