pytorch中池化函数详解

1 池化概述

1.1 什么是池化

池化层是卷积神经网络中常用的一个组件,池化层经常用在卷积层后边,通过池化来降低卷积层输出的特征向量,避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的视觉系统对数据进行降维,用更高层次的特征表示图像。池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。

池化操作的基本思想是将特征图划分为若干个子区域(一般为矩形),并对每个子区域进行统计汇总。池化操作的方式可以有很多种,比如最大池化(Max Pooling)、平均池化(Average Pooling)等。其中,最大池化操作会选取每个子区域内的最大值作为输出,而平均池化操作则会计算每个子区域内的平均值作为输出。

1.2 池化的作用

理论上来说,网络可以在不对原始输入图像执行降采样的操作,通过堆叠多个的卷积层来构建深度神经网络,如此一来便可以在保留更多空间细节信息的同时提取到更具有判别力的抽象特征。然而,考虑到计算机的算力瓶颈,通常都会引入池化层,来进一步地降低网络整体的计算代价,这是引入池化层最根本的目的。

池化层大大降低了网络模型参数和计算成本,也在一定程度上降低了网络过拟合的风险。概括来说,池化层主要有以下五点作用:

  • 增大网络感受野

  • 抑制噪声,降低信息冗余

  • 降低模型计算量,降低网络优化难度,防止网络过拟合

  • 使模型对输入图像中的特征位置变化更加鲁棒

1.3 池化核大小

池化窗口的大小,在PyTorch里池化核大小可以是一个整数或者一个元组,例如 kernel_size=2 或者 kernel_size=(2, 3)。

  • 如果是一个整数,则表示高和宽方向上的池化窗口大小相同;
  • 如果是一个元组,则第一个元素表示高方向上的池化窗口大小,第二个元素表示宽方向上的池化窗口大小。

1.4 步幅大小

用于指定池化窗口在高和宽方向上的步幅大小,可以是一个整数或者一个元组,例如 stride=2 或者 stride=(2, 3)。

  • 如果是一个整数,则表示高和宽方向上的步幅大小相同;
  • 如果是一个元组,则第一个元素表示高方向上的步幅大小,第二个元素表示宽方向上的步幅大小。

1.5 填充

池化层的填充(padding)可以控制池化操作在特征图边缘的行为,使得池化后的输出特征图与输入特征图大小相同或相近。

在池化操作时,如果输入特征图的尺寸不能被池化窗口的大小整除,那么最后一列或者最后一行的部分像素就无法被包含在池化窗口中进行池化,因此池化后的输出特征图尺寸会减小。

通过在输入特征图的边缘添加填充,可以使得池化操作在边缘像素处进行池化,避免了信息的丢失,并且保持了输出特征图的大小与输入特征图相同或相近。同时,填充也可以增加模型的稳定性,减少过拟合的风险。

需要注意的是,池化层的填充和卷积层的填充有所不同:

  • 池化层的填充通常是指在输入特征图的边缘添加0值像素;
  • 卷积层的填充是指在输入特征图的边缘添加0值像素或者复制边缘像素。

PyTorch里的填充大小可以是一个整数或者一个元组,例如 padding=1 或者 padding=(1, 2)。

  • 如果是一个整数,则表示在高和宽方向上的填充大小相同;
  • 如果是一个元组,则第一个元素表示高方向上的填充大小,第二个元素表示宽方向上的填充大小。默认为 0,表示不进行填充。

2 pytorch中的池化函数

PyTorch 提供了多种池化函数,用于对输入数据进行不同类型的池化操作。


以下是一些常用的 PyTorch 池化函数:

2.1 平均池化(Average Pooling):

  • nn.AvgPool1d: 一维平均池化。

  • nn.AvgPool2d: 二维平均池化。

  • nn.AvgPool3d: 三维平均池化。

2.2 最大池化(Max Pooling):  

  • nn.MaxPool1d: 一维最大池化。

  • nn.MaxPool2d: 二维最大池化。

  • nn.MaxPool3d: 三维最大池化。

2.3 全局池化(Global Pooling):  

  • nn.AdaptiveAvgPool1d: 自适应一维平均池化,用于将整个输入降维为指定大小。

  • nn.AdaptiveAvgPool2d: 自适应二维平均池化,用于将整个输入降维为指定大小。

  • nn.AdaptiveAvgPool3d: 自适应三维平均池化,用于将整个输入降维为指定大小。

  • nn.AdaptiveMaxPool1d: 自适应一维最大池化,用于将整个输入降维为指定大小。

  • nn.AdaptiveMaxPool2d: 自适应二维最大池化,用于将整个输入降维为指定大小。

  • nn.AdaptiveMaxPool3d: 自适应三维最大池化,用于将整个输入降维为指定大小。

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

3 池化层的pytorch实现

3.1 平均池化

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

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

函数构成:

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

示例:

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)  

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

函数构成:

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

示例:

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) 

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

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

函数构成:

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

示例:

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)  # 输出平均池化后的结果

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

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

3.2 最大池化

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

函数构成:

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

示例:

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)  # 输出最大池化后的结果

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

函数构成:

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

示例:

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)  # 输出最大池化后的结果

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

函数构成:

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

示例:

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)  # 输出最大池化后的结果

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

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

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

3.3 全局池化

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

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

函数构成:

adaptive_avg_pool = nn.AdaptiveAvgPool1d(output_size)

示例:

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)  # 输出自适应平均池化后的结果

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

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

函数构成:

adaptive_avg_pool = nn.AdaptiveAvgPool2d(output_size)

示例:

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)  # 输出自适应平均池化后的结果

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

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

函数构成:

adaptive_avg_pool = nn.AdaptiveAvgPool3d(output_size)

示例:

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)  # 输出自适应平均池化后的结果

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

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

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

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

函数构成:

adaptive_max_pool = nn.AdaptiveMaxPool1d(output_size)

这些函数构成中,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)  # 输出自适应最大池化后的结果

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

函数构成:

adaptive_max_pool = nn.AdaptiveMaxPool2d(output_size)

示例:

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)  # 输出自适应最大池化后的结果

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

函数构成:

adaptive_max_pool = nn.AdaptiveMaxPool3d(output_size)

示例:
 

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)  # 输出自适应最大池化后的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/270946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能:网络犯罪分子的驱动力

随着 2024 年的临近,是时候展望今年的网络安全状况了。由于网络犯罪日益复杂,预计到 2025 年,全球网络安全成本将增至 10.5 万亿美元。 人工智能的使用不断发展,网络犯罪分子变得越来越有创造力 我们注意到,联邦调查…

2023年12月25日:串口发出控制命令

代码 uart4.c #include "uart4.h"void uart4_config() {//*****************************************//使能GPIOB|GPIOG|UART4外设时钟RCC->MP_AHB4ENSETR |(0x1<<6);RCC->MP_AHB4ENSETR |(0x1<<1);RCC->MP_APB1ENSETR |(0x1<<16);RCC…

云计算:现代技术的基本要素

众所周知&#xff0c;在儿童教育的早期阶段&#xff0c;幼儿园都会传授塑造未来行为的一些基本准则。 今天&#xff0c;我们可以以类似的方式思考云计算&#xff1a;它已成为现代技术架构中的基本元素。云现在在数字交互、安全和基础设施开发中发挥着关键作用。云不仅仅是另一…

小狐狸GPT付费2.4.9 去除授权弹窗版

后台安装步骤&#xff1a; 1、在宝塔新建个站点&#xff0c;php版本使用7.2 、 7.3 或 7.4&#xff0c;把压缩包上传到站点根目录&#xff0c;运行目录设置为/public 2、导入数据库文件&#xff0c;数据库文件是 /db.sql 3、修改数据库连接配置&#xff0c;配置文件是/.env 4、…

LED驱动电源

LED驱动电源 常用电子元器件 TB62726AFG LED SOP-24 文章目录 LED驱动电源前言一、LED驱动电源是什么二、TB62726AFG LED SOP-24总结 前言 LED驱动电源可以根据应用需求采用不同的输入和输出电源类型、电源转换拓扑、调光方式等。常见的LED驱动电源类型包括恒流驱动电源、恒…

3分钟了解安全数据交换系统有什么用!

企业为了保护核心数据安全&#xff0c;都会采取一些措施&#xff0c;比如做网络隔离划分&#xff0c;分成了不同的安全级别网络&#xff0c;或者安全域&#xff0c;接下来就是需要建设跨网络、跨安全域的安全数据交换系统&#xff0c;将安全保障与数据交换功能有机整合在一起&a…

uni-app封装表格组件

组件代码&#xff1a; <template><view><uni-table class"tableBox" border stripe emptyText"暂无更多数据" ><!-- 表头行 --><uni-tr class"tableTr"><uni-th align"center" v-for"item in …

LNPMariadb数据库分离|web服务器集群

LNP&Mariadb数据库分离&#xff5c;web服务器集群 网站架构演变单机版LNMP独立数据库服务器web服务器集群与Session保持 LNP与数据库分离1. 准备一台独立的服务器&#xff0c;安装数据库软件包2. 将之前的LNMP网站中的数据库迁移到新的数据库服务器3. 修改wordpress网站配置…

共享和独享的区别是什么?有必要用独享IP吗?

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

【技术分享】单网口远程透传网关快速实现昆仑通态触摸屏程序远程上下载及监控

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接触摸屏一台昆仑通态触摸屏及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff0…

String 的特点是什么?它有哪些重要的方法?

几乎所有的 Java 面试都是以 String 开始的&#xff0c;如果第一个问题没有回答好&#xff0c;则会给面试官留下非常不好的第一印象&#xff0c;而糟糕的第一印象则会直接影响到自己的面试结果&#xff0c;就好像刚破壳的小鹅一样&#xff0c;会把第一眼看到的动物当成自己的母…

走进数字金融峰会,为金融科技数字化赋能

12月20—21日&#xff0c;FSIDigital数字金融峰会在上海圆满召开。本次峰会包含InsurDigital数字保险峰会和B&SDigital数字银行与证券峰会2场平行峰会&#xff1b;吸引了近600位来自保险、银行、证券以及金融科技等行业的领导者和专家齐聚一堂&#xff0c;共同探讨金融业数…

数据库01_增删改查

1、什么是数据&#xff1f;什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库&#xff1a;存放数据的仓库&#xff0c;数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

docker-compose部署kafka

docker-compose.yml配置 version: "3" services:kafka:image: bitnami/kafka:latestports:- 7050:7050environment:- KAFKA_ENABLE_KRAFTyes- KAFKA_CFG_PROCESS_ROLESbroker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER- KAFKA_CFG_LISTENERSPLAIN…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

【教程】从gitee或者github,下载单个文件或文件夹命令

1.打开git 2.初始化 git init 3.设置允许下载子目录 &#xff08;不需要修改任何&#xff0c;只要原样复制&#xff0c;需要按照个人状况修改的话我会标注&#xff09; git config core.sparseCheckout true 4. 选择要下载的单个文件夹的路径 这里单引号内部需要修改&…

Shell 脚本基础

Shell脚本 脚本以#!/bin/bash开头 执行方式 直接使用文件名执行&#xff1a;文件需要执行权限 以bash xxx.sh来执行, 本质上是bash解析器去执行, 文件作为一个输入, 因此可以不需要执行权限 变量 系统变量 自定义变量 定义变量 # 定义一个变量username, 注意不能有多余…

一体机定制_工控触控一体机安卓主板方案

工控一体机是一种集成化的硬件方案&#xff0c;采用了联发科MT8768八核芯片和12nm制程工艺。该芯片拥有2.0GHz的主频和IMG PowerVR GE8320图形处理GPU&#xff0c;具备强大的视频处理能力&#xff0c;并且兼容大部分的视频格式和解码能力。工控一体机搭载了Android 9.0操作系统…

学Java的第二天

一、常量 1.值不可以变化的量。 2. 分类&#xff1a; 字符串常量 用双引号括起来的多个字符&#xff0c;可以包含 0、1 或多个&#xff0c;例如 "a" 、 "abc" 、 " 中国 " 整数常量&#xff0c;例如&#xff1a; -10 、 0 、 88 小数常量&…

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法

目录 1. 概念2. getFields()方法2. getDeclaredFields()方法4. 总结 1. 概念 反射是Java中一种强大的机制&#xff0c;允许在运行时获取、检查和操作类、方法、字段等信息&#xff0c;而不需要在编译时知道这些信息。 其中字段&#xff08;Field&#xff09;在Java中是类中用…