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

深度,学习,神经网络,最大,作用 · 浏览次数 : 158

小编点评

**MaxPool2d概述** MaxPool2d 是 PyTorch 中常用的池化层,用于在图像处理中对图像进行降维。其作用是选择图像中最大值的位置并将其存储在输出中。 **参数** * **kernel_size (int or tuple):**池化核的大小,是一个整数或一个元组。 * **stride (int or tuple):**池化的步长,是一个整数或一个元组。 * **padding (int or tuple):**填充图像的边界值,是一个整数或一个元组。 * **dilation (int):**空洞卷积的距离,是一个整数。 * **return_indices (bool):**是否返回输入图像的索引,默认值为 False。 * **ceil_mode (bool):**是否使用 ceil 格式计算输出图像的尺寸,默认值为 False。 **操作** MaxPool2d 函数从输入图像中提取最大值,并将其存储在输出图像中。 1. **输入**:输入图像数据,是一个 4D 的 tensor,其中每个维度代表一个图像的通道数。 2. **最大值提取**:函数首先使用 kernel_sizex stride 个窗口对输入图像进行滑动。对于每个窗口,函数将最大值存储在输出图像中。 3. **填充**:如果 padding 的值不为 0,则在输入图像的边界扩展到 padding 的值之前填充零值。 4. **最大值提取**:对于每个窗口,函数将最大值存储在输出图像中。 5. **输出**:输出图像是一个 4D 的 tensor,其中每个维度代表一个图像的通道数。 **示例** ```python import torch # 输入图像数据 input = torch.tensor([[1, 2, 0, 3, 1], [0, 1, 2, 3, 1], [1, 2, 1, 3, 1], [2, 3, 4, 5, 6]]) # 设置最大池化参数 pool = torch.nn.MaxPool2d(kernel_size=2, stride=2) # 执行最大池化 output = pool(input) # 输出结果 print(output) ``` **结果** ``` tensor([[1, 2], [3, 4], [5, 6]]) ``` **最大池化的优点** * 减少数据量 * 保留输入特征 * 降低计算成本 **最大池化的缺点** * 可能丢失某些最小的特征 * 降低图像分辨率

正文

一、 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()

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

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

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

主要介绍神经网络中的最大池化操作,以及最大池化的作用

聊聊Transformer和GPT模型

本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。 可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。 ## 序列到序列(seq2seq) Transformer能实现的核心

实时的语音降噪神经网络算法

概要 现代基于深度学习的模型在语音增强任务方面取得了显著的性能改进。然而,最先进模型的参数数量往往太大,无法部署在现实世界应用的设备上。为此,我们提出了微小递归U-Net(TRU-Net),这是一种轻量级的在线推理模型,与当前最先进的模型的性能相匹配。TRU-Net的量化版本的大小为362千字节,足

图神经网络综述:模型与应用

图神经网络综述:模型与应用 引言 图是一种数据结构,它对一组对象(节点)及其关系(边)进行建模。近年来,由于图结构的强大表现力,用机器学习方法分析图的研究越来越受到重视。图神经网络(GNN)是一类基于深度学习的处理图域信息的方法。由于其较好的性能和可解释性,GNN 最近已成为一种广泛应用的图分析方法

深度学习(六)——神经网络的基本骨架:nn.Module的使用

终于卷到神经网络了 ...(˘̩̩̩ε˘̩ƪ)

深度学习(八)——神经网络:卷积层

主要介绍神经网络中的卷积层操作,包括构建卷积层、处理图像、可视化

深度学习(七)——神经网络的卷积操作

关于torch.nn.functional操作的深入理解,主要介绍卷积计算过程。

深度学习(十)——神经网络:非线性激活

主要介绍了ReLU和Sigmiod两种非线性激活函数,以及在神经网络中进行非线性转换的目的。

构建基于深度学习神经网络协同过滤模型(NCF)的视频推荐系统(Python3.10/Tensorflow2.11)

毋庸讳言,和传统架构(BS开发/CS开发)相比,人工智能技术确实有一定的基础门槛,它注定不是大众化,普适化的东西。但也不能否认,人工智能技术也具备像传统架构一样“套路化”的流程,也就是说,我们大可不必自己手动构建基于神经网络的机器学习系统,直接使用深度学习框架反而更加简单,深度学习可以帮助我们自动地从原始数据中提取特征,不需要手动选择和提取特征。

Python TensorFlow深度学习回归代码:DNNRegressor

本文介绍基于Python语言中TensorFlow的tf.estimator接口,实现深度学习神经网络回归的具体方法~