• pytorch中的池化函数


    PyTorch 提供了多种池化函数,用于对输入数据进行不同类型的池化操作。以下是一些常用的 PyTorch 池化函数:

    1. 平均池化(Average Pooling):

      • nn.AvgPool1d: 一维平均池化。
      • nn.AvgPool2d: 二维平均池化。
      • nn.AvgPool3d: 三维平均池化。
    2. 最大池化(Max Pooling):

      • nn.MaxPool1d: 一维最大池化。
      • nn.MaxPool2d: 二维最大池化。
      • nn.MaxPool3d: 三维最大池化。
    3. 全局池化(Global Pooling):

      • nn.AdaptiveAvgPool1d: 自适应一维平均池化,用于将整个输入降维为指定大小。
      • nn.AdaptiveAvgPool2d: 自适应二维平均池化,用于将整个输入降维为指定大小。
      • nn.AdaptiveAvgPool3d: 自适应三维平均池化,用于将整个输入降维为指定大小。
      • nn.AdaptiveMaxPool1d: 自适应一维最大池化,用于将整个输入降维为指定大小。
      • nn.AdaptiveMaxPool2d: 自适应二维最大池化,用于将整个输入降维为指定大小。
      • nn.AdaptiveMaxPool3d: 自适应三维最大池化,用于将整个输入降维为指定大小。

    这些池化函数允许你对不同维度的输入数据进行平均池化或最大池化,并且有自适应版本,可以自动调整输入大小以满足指定的输出大小。选择适当的池化函数取决于你的应用和输入数据的维度。

    一.池化层的作用

    不同类型的池化层在深度学习中具有不同的作用,它们通常用于特征提取、降维和提高模型的鲁棒性。以下是不同池化层的作用:

    1. 平均池化(Average Pooling)

      • 作用:平均池化层计算池化区域内元素的平均值,并将结果作为输出。它有助于减少特征图的尺寸,同时保留一定程度的特征信息。
      • 用途:常用于图像分类和一些简单的特征提取任务。
    2. 最大池化(Max Pooling)

      • 作用:最大池化层计算池化区域内元素的最大值,并将最大值作为输出。它有助于保留图像中的主要特征,提高对平移和小尺度变化的鲁棒性。
      • 用途:常用于图像分类、物体检测和卷积神经网络中的特征提取。
    3. 全局池化(Global Pooling)

      • 作用:全局池化层通过对整个特征图进行池化操作,将特征图降维为一个单一的值或向量。它有助于捕获全局特征,减少模型参数。
      • 用途:常用于图像分类任务,用于将卷积特征映射到分类层之前。
    4. 自适应池化(Adaptive Pooling)

      • 作用:自适应池化层根据指定的输出大小,动态调整池化核的大小以适应不同尺寸的输入特征图。这使得它能够处理不同大小的输入。
      • 用途:常用于需要对输入尺寸不敏感的任务,如图像分类、目标检测和分割。

    总之,不同池化层在深度学习中的作用是对输入特征进行不同的处理和降维操作,以提取重要信息并减少模型的计算复杂性。选择合适的池化层取决于你的任务和输入数据的性质。最大池化常用于特征提取,全局池化用于全局特征捕获,自适应池化用于处理不同尺寸的输入。

    以下是各种池化函数的示例用法,包括一维、二维和自适应池化。示例中的输入数据和参数可能需要根据你的具体情况进行调整。

    二.池化层的pytorch实现

    1.平均池化(Average Pooling)pytorch实现

    (1)一维平均池化(nn.AvgPool1d)

    不同池化函数的构造方式在 PyTorch 中基本相似,它们都是基于 nn.Module 类的子类,并具有一些特定的参数。这些池化函数的构造函数通常需要指定池化核的大小 (kernel_size),步幅 (stride) 和填充 (padding),以控制池化操作的行为。对于自适应池化,你需要指定目标输出大小 (output_size),而不需要手动设置核大小和步幅。

    函数构成:

    avg_pool = nn.AvgPool1d(kernel_size, stride, padding)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个一维输入张量
    x = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
    
    # 创建一个一维平均池化层,指定池化核大小为2
    avg_pool = nn.AvgPool1d(kernel_size=2)
    
    # 对输入进行一维平均池化
    output = avg_pool(x.unsqueeze(0).unsqueeze(0))
    
    print(output)  # 输出平均池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (2)二维平均池化(nn.AvgPool2d)

    函数构成:

    avg_pool = nn.AvgPool2d(kernel_size, stride, padding)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个二维输入张量(4x4的图像)
    x = torch.tensor([[1.0, 2.0, 3.0, 4.0],
                      [5.0, 6.0, 7.0, 8.0],
                      [9.0, 10.0, 11.0, 12.0],
                      [13.0, 14.0, 15.0, 16.0]], dtype=torch.float32)
    
    # 创建一个二维平均池化层,指定池化核大小为2x2
    avg_pool = nn.AvgPool2d(kernel_size=2)
    
    # 对输入进行二维平均池化
    output = avg_pool(x.unsqueeze(0).unsqueeze(0))
    
    print(output)  # 输出平均池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上面的示例中,我们使用了一个4x4的二维输入张量,并创建了一个2x2的池化核进行平均池化。

    (3)三维平均池化(nn.AvgPool3d)

    函数构成:

    avg_pool = nn.AvgPool3d(kernel_size, stride, padding)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个三维输入张量(4x4x4的数据)
    x = torch.randn(1, 1, 4, 4, 4)  # 随机生成一个大小为4x4x4的三维张量
    
    # 创建一个三维平均池化层,指定池化核大小为2x2x2
    avg_pool = nn.AvgPool3d(kernel_size=2)
    
    # 对输入进行三维平均池化
    output = avg_pool(x)
    
    print(output)  # 输出平均池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上面的示例中,我们使用了一个随机生成的4x4x4的三维输入张量,并创建了一个2x2x2的池化核进行平均池化。

    这些示例演示了如何使用PyTorch的nn.AvgPool2dnn.AvgPool3d函数对二维和三维数据进行平均池化操作。你可以根据你的需求自定义输入数据和池化核的大小。

    2.最大池化(Max Pooling)pytorch实现

    (1)一维最大池化(nn.MaxPool1d)

    函数构成:

    max_pool = nn.MaxPool1d(kernel_size, stride, padding)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个一维输入张量
    x = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
    
    # 创建一个一维最大池化层,指定池化核大小为2
    max_pool = nn.MaxPool1d(kernel_size=2)
    
    # 对输入进行一维最大池化
    output = max_pool(x.unsqueeze(0).unsqueeze(0))
    
    print(output)  # 输出最大池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (2)二维最大池化(nn.MaxPool2d)

    函数构成:

    max_pool = nn.MaxPool2d(kernel_size, stride, padding)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个二维输入张量(3x3的图像)
    x = torch.tensor([[1.0, 2.0, 3.0],
                      [4.0, 5.0, 6.0],
                      [7.0, 8.0, 9.0]])
    
    # 创建一个二维最大池化层,指定池化核大小为2x2
    max_pool = nn.MaxPool2d(kernel_size=2)
    
    # 对输入进行二维最大池化
    output = max_pool(x.unsqueeze(0).unsqueeze(0))
    
    print(output)  # 输出最大池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (3)三维最大池化(nn.MaxPool3d)

    函数构成:

    max_pool = nn.MaxPool3d(kernel_size, stride, padding)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个随机的三维输入张量(2x2x2x2的数据)
    x = torch.randn(1, 1, 2, 2, 2)  # 随机生成一个大小为2x2x2x2的三维张量
    
    # 创建一个三维最大池化层,指定池化核大小为2x2x2
    max_pool = nn.MaxPool3d(kernel_size=2)
    
    # 对输入进行三维最大池化
    output = max_pool(x)
    
    print(output)  # 输出最大池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这个示例中,我们创建了一个大小为 2x2x2x2 的随机三维输入张量 x,然后使用 nn.MaxPool3d 创建了一个三维最大池化层,指定了池化核大小为 2x2x2。最后,我们对输入张量进行了三维最大池化操作,并打印了池化后的结果。

    这个示例演示了如何使用 PyTorch 进行三维最大池化操作,你可以根据你的需求自定义输入数据和池化核的大小。

    以上示例展示了各种池化函数的用法,你可以根据需要选择适合你的任务和输入数据维度的池化函数,并调整参数以满足具体要求。

    3.全局池化(Global Pooling)pytorch实现

    以下是自适应一维、二维和三维平均池化的示例:

    (1)自适应一维平均池化(nn.AdaptiveAvgPool1d)

    函数构成:

    adaptive_avg_pool = nn.AdaptiveAvgPool1d(output_size)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个一维输入张量
    x = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0])
    
    # 创建一个自适应一维平均池化层,指定目标输出大小为3
    adaptive_avg_pool = nn.AdaptiveAvgPool1d(output_size=3)
    
    # 对输入进行自适应一维平均池化
    output = adaptive_avg_pool(x.unsqueeze(0).unsqueeze(0))
    
    print(output)  # 输出自适应平均池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上面的示例中,我们使用了一个自适应一维平均池化层,指定了目标输出大小为 3。

    (2)自适应二维平均池化(nn.AdaptiveAvgPool2d)

    函数构成:

    adaptive_avg_pool = nn.AdaptiveAvgPool2d(output_size)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个二维输入张量(4x4的图像)
    x = torch.tensor([[1.0, 2.0, 3.0, 4.0],
                      [5.0, 6.0, 7.0, 8.0],
                      [9.0, 10.0, 11.0, 12.0],
                      [13.0, 14.0, 15.0, 16.0]])
    
    # 创建一个自适应二维平均池化层,指定目标输出大小为 (2, 2)
    adaptive_avg_pool = nn.AdaptiveAvgPool2d(output_size=(2, 2))
    
    # 对输入进行自适应二维平均池化
    output = adaptive_avg_pool(x.unsqueeze(0).unsqueeze(0))
    
    print(output)  # 输出自适应平均池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上面的示例中,我们使用了一个自适应二维平均池化层,指定了目标输出大小为 (2, 2)。

    (3)自适应三维平均池化(nn.AdaptiveAvgPool3d)

    函数构成:

    adaptive_avg_pool = nn.AdaptiveAvgPool3d(output_size)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个三维输入张量(4x4x4的数据)
    x = torch.randn(1, 1, 4, 4, 4)  # 随机生成一个大小为4x4x4的三维张量
    
    # 创建一个自适应三维平均池化层,指定目标输出大小为 (2, 2, 2)
    adaptive_avg_pool = nn.AdaptiveAvgPool3d(output_size=(2, 2, 2))
    
    # 对输入进行自适应三维平均池化
    output = adaptive_avg_pool(x)
    
    print(output)  # 输出自适应平均池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上面的示例中,我们使用了一个自适应三维平均池化层,指定了目标输出大小为 (2, 2, 2)。

    这些示例演示了如何使用 PyTorch 的 nn.AdaptiveAvgPool1dnn.AdaptiveAvgPool2dnn.AdaptiveAvgPool3d 函数对一维、二维和三维数据进行自适应平均池化操作,我们可以根据需求自定义输入数据和目标输出大小。

    以下是分别使用自适应一维、二维和三维最大池化的示例:

    (4)自适应一维最大池化(AdaptiveMaxPool1d)

    函数构成:

    adaptive_max_pool = nn.AdaptiveMaxPool1d(output_size)
    
    • 1

    这些函数构成中,output_size 是一个元组,用于指定目标输出的大小,这将决定池化窗口的大小。自适应池化会根据输出大小自动调整池化窗口,以使输出尺寸与指定的 output_size 匹配。这使得池化操作能够适应不同输入数据的尺寸,而不需要显式指定池化窗口的大小。

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个一维输入张量(长度为 8)
    x = torch.randn(1, 1, 8)  # 随机生成一个长度为 8 的一维张量
    
    # 创建一个自适应一维最大池化层,指定目标输出大小为 4
    adaptive_max_pool = nn.AdaptiveMaxPool1d(output_size=4)
    
    # 对输入进行自适应一维最大池化
    output = adaptive_max_pool(x)
    
    print(output)  # 输出自适应最大池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (5)自适应二维最大池化(AdaptiveMaxPool2d)

    函数构成:

    adaptive_max_pool = nn.AdaptiveMaxPool2d(output_size)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个二维输入张量(4x4的数据)
    x = torch.randn(1, 1, 4, 4)  # 随机生成一个大小为 4x4 的二维张量
    
    # 创建一个自适应二维最大池化层,指定目标输出大小为 (2, 2)
    adaptive_max_pool = nn.AdaptiveMaxPool2d(output_size=(2, 2))
    
    # 对输入进行自适应二维最大池化
    output = adaptive_max_pool(x)
    
    print(output)  # 输出自适应最大池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (6)自适应三维最大池化(AdaptiveMaxPool3d)

    函数构成:

    adaptive_max_pool = nn.AdaptiveMaxPool3d(output_size)
    
    • 1

    示例:

    import torch
    import torch.nn as nn
    
    # 创建一个三维输入张量(4x4x4的数据)
    x = torch.randn(1, 1, 4, 4, 4)  # 随机生成一个大小为 4x4x4 的三维张量
    
    # 创建一个自适应三维最大池化层,指定目标输出大小为 (2, 2, 2)
    adaptive_max_pool = nn.AdaptiveMaxPool3d(output_size=(2, 2, 2))
    
    # 对输入进行自适应三维最大池化
    output = adaptive_max_pool(x)
    
    print(output)  # 输出自适应最大池化后的结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这些示例演示了如何使用自适应最大池化层在不指定池化窗口大小的情况下,根据目标输出大小自动调整池化窗口大小进行池化操作。

  • 相关阅读:
    无胁科技-TVD每日漏洞情报-2022-9-20
    DADPS Biotin Azide( CAS:1260247-50-4生物素基团和叠氮基团的 PEG 衍生物
    2022 深度学习 & 计算机视觉 & 感知算法 面经整理 二十三(221 222 223 224 225 226 227 228 229 230)
    【C++入门基础】命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数
    【代码随想录】算法训练营 第十三天 第五章 栈与队列 Part 3
    英特尔:如何从“小芯片”布局到通用量子计算机
    SQL 学习笔记
    C. Water the Trees Educational Codeforces Round 126 (Rated for Div. 2)
    青少年CTF-WEB-2048
    【学习笔记】Windows GDI绘图(九)Graphics详解(上)
  • 原文地址:https://blog.csdn.net/thy0000/article/details/133678642