Torch 池化操作大全 MaxPool2d MaxUnpool2d AvgPool2d FractionalMaxPool2d LPPool2d AdaptivePool2d dilation详解

article/2025/11/6 12:17:11

torch 池化操作

    • 1 池化操作
    • 2 类型
      • 2.1 MaxPool2d()
      • 2.2 MaxUnPool2d()
      • 2.3 AvgPool2d()
      • 2.4 FractionalMaxPool2d()
      • 2.5LPPool2d()
      • 2.6AdaptiveMaxPool2d()
      • 2.7 AdaptiveAvgPool2d()
    • 3 总结


自我学习记录,他人转载请注明出处


1 池化操作

作用: 提取图片重点特征,减小图片尺寸大小,从而减少最后的输出数量,池化有不同类型,以下包含torch中针对图像的所有池化操作讲解。

2 类型

2.1 MaxPool2d()

参数:

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

在这里插入图片描述

需要注意的是

  1. 当stride不给参数的时候,stride=kernel_size;
  2. dilation默认为1,当dilation大于等于2时,则每个卷积核中元素之间相隔diliation-1个位置,然后进行采样,这里只是增加采样区间,但是采样的个数还是不变的,例如kernel_size=3,那么卷积核为33一共9个元素中找最大的,如果dilation为2,那么卷积核为**55**,范围是5*5,但是采样的个数还是9个中找最大,例子如下:

在这里插入图片描述
dilation>=2,只是扩大了搜索范围,但是能采样的点数量不变!!!

  1. ceil_model默认为False,当设置为True时,增加取样点的,每一列的右边增加了kernel_size-W%kernel_size列数,下面增加了kernel-H%kernel_size行数!

ceil_model=True:
在这里插入图片描述
ceul_mode= False:
在这里插入图片描述

  1. return_indices默认为False,如果为True,则也会返回采样值的位置信息

return_indices=True:
在这里插入图片描述
因为是从0开始计数的,所以返回的索引值是能看懂的吧,这里挖个坑,我猜SegNet中最重要的Pool Indices就是借助这个参数实现的!

2.2 MaxUnPool2d()

真相了,最近看过segNet论文,模型铁定是借助了MaxPool2d和MaxUnPoold实现最关键的Pool Indices的,如果不是回来打脸!
参数:

torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0)

在这里插入图片描述
直接上例子:

from torch.nn import MaxPool2d,MaxUnpool2d
x = torch.randn(1,1,4,4)
pool = MaxPool2d(2,return_indices=True)    # 这个返回两个东西,一个是最大值,一个是最大值的索引
unPool = MaxUnpool2d(2)
print("原始数据:",x)
y, ind= pool(x)
print("采样数据:",y)
print("索引值:",ind)
print("恢复值:",unPool(y,ind))

在这里插入图片描述
需要注意的地方就是,当MaxPool2d中的return_indices=True时,返回值是两个,需要使用两个东西进行接收;同时在使用MaxUnpool2d时候,也是需要传入两个参数的

2.3 AvgPool2d()

参数:

torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)

在这里插入图片描述
ceil_model的含义见2.1,count_nclude_pad参数名字就是指的是求均值时,padding的值是否需要计算在内,divisor_override见图片标记。
直接上例子:
素的:
在这里插入图片描述
padding=1+count_include_pad=False
在这里插入图片描述
divisor_override=1
在这里插入图片描述

2.4 FractionalMaxPool2d()

参数:

torch.nn.FractionalMaxPool2d(kernel_size, output_size=None, output_ratio=None, return_indices=False, _random_samples=None)

在这里插入图片描述
还是比较好理解的,直接上例子:
output_size=(5,5)
在这里插入图片描述
output_ratio=0.6
在这里插入图片描述
return_indices+MaxunPool2d

from torch.nn import FractionalMaxPool2d,MaxUnpool2dx = torch.randn(1,1,6,6)
print("原始数据:",x)
Avg = FractionalMaxPool2d(2,output_ratio=0.5, return_indices=True)
y , ind = Avg(x)
print("采样数据:",y)
print("索引值:", ind)
unPool = MaxUnpool2d(2)
print("恢复数据:",unPool(y, ind))

在这里插入图片描述
恢复的完美,这个池化操作,更多的是让网络学习步长吧,不知道是不是的,以后填坑!

2.5LPPool2d()

参数:

torch.nn.LPPool2d(norm_type, kernel_size, stride=None, ceil_mode=False)

在这里插入图片描述

作用:
在这里插入图片描述

就是计算X内所有数据P次方和后再开P次方

使用时,需要指定P,当P为无穷大时,相当于MaxPooling,想一下,没毛病,如果P=1,就相当于SumPooling
例子:p=2+k=2

from torch.nn import LPPool2d
import torch
import math
x = torch.range(1,20).reshape(1,1,4,5)
print("原始数据:", x)
pool = LPPool2d(norm_type=2, kernel_size=2)
print("pool后数据:",pool(x))
print(math.sqrt(90), math.sqrt(9+16+64+81))

在这里插入图片描述
P=30+k=2:

from torch.nn import LPPool2d
import torch
import math
x = torch.range(1,20).reshape(1,1,4,5)
print("原始数据:", x)
pool = LPPool2d(norm_type=30, kernel_size=2)
print("pool后数据:",pool(x))

在这里插入图片描述
剩下参数ceil_mode就不写例子了,详情看上面的,都是一样的意思!

2.6AdaptiveMaxPool2d()

参数:

torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)

在这里插入图片描述

注意这里和 FractionalMaxPool2d比较一下, FractionalMaxPool2d是指定卷积核大小,但是这个AdaptiveMaxPool2d,不设置卷积核大小,随缘,可学习,所以注意区分。

直接上例子:return_indices+MaxUnpool2d

from torch.nn import AdaptiveMaxPool2d, MaxUnpool2d
import torch
import math
x = torch.range(1,20).reshape(1,1,4,5)
print("原始数据:", x)
pool = AdaptiveMaxPool2d(output_size=3, return_indices=True)
y, ind = pool(x)
unpool = MaxUnpool2d(2)
print("pool后数据:",y)
print("索引为:", ind)
print("恢复后的数据:",unpool(y, ind))

在这里插入图片描述
个人认为这里的AdaptiveMaxPool2d很少和MaxUnpool2d一起用,因为Adaptive固定不了kernel,所以还原的时候存在偏差

2.7 AdaptiveAvgPool2d()

torch.nn.AdaptiveAvgPool2d(output_size)

在这里插入图片描述

作用: 更简单了,就是自适应平均池化层,指定输出大小就行了

直接上例子:
在这里插入图片描述
这里的output_size可以大于input_size大小

3 总结

从torch官网看,针对图片,有这7中池化操作,大概分为最大池化类,平均池化类,杂类

  1. 最大池化实现有四种方式,MaxPool2d,可以设置k,s,p,但是不能设置输出大小,输出大小是计算好的;FractionalMaxPool2d,可以设置k,和输出大小,单数s和p不能设置;AdaptiveMaxPool2d,只能设置输出大小,其余的都设置不了;LPPool2d,这个纯属特列才可以使用,并且特例中的功能还是MaxPool2d的阉割版;除了LPPool2d,其余逐步自由化,增加了网络设置的随机性;
  2. 平均池化实现有两种方式,AvgPool2d,可以设置k,s,p,分母,是否计算pad值,输出大小不能设置,是计算出来的;AdaptiveAvgPool2d,只能设置一个输出大小,其余的都不能设置,也是逐步自由化;
  3. 杂类,MaxUnpool2d,是实现Max池化特征恢复的好手段,主要就是配合Max池化操作;LPPool2d,当p为1时,可以实现Sum Pool操作,同时AvgPool2d中指定分母也是可以实现Sum Pool操作的

http://chatgpt.dhexx.cn/article/D1Zlbojs.shtml

相关文章

nn.Conv2d中的dilation

参考链接:https://blog.csdn.net/jokerxsy/article/details/108614661 nn.Conv2d中的dilation dilation 1: dilation2:

nn.Conv1d\nn.Conv2d以及groups\dilation参数的理解

文章目录 nn.Conv1dnn.Conv2dnn.Conv2d中groups参数和dilation参数的理解groupsdilation 参考 nn.Conv1d 代码: nn.Conv1d(in_channels 16, out_channels 16, kernel_size (3,2,2), stride (2,2,1), padding [2,2,2])如果输入为: x torch.randn(10,16,30,32,34)则: 1…

剪胀角 angle of dilation

Abaqus选择库伦摩尔塑性模型的时候,需要选择摩擦角和剪胀角。摩擦角物理意义明确,但何为剪胀角?如何影响结果呢?(这两个问题,暂无统一解,Abaqus默认剪胀角最小是0.1) The angle of d…

3.TransposedConv2d实现 (含dilation)

[C 基于Eigen库实现CRN前向推理] 第三部分:TransposedConv2d实现 (含dilation) 前言:(Eigen库使用记录)第一部分:WavFile.class (实现读取wav/pcm,实现STFT)第二部分:Conv2d实现第三部分:Tran…

对卷积层dilation膨胀的作用的理解,caffe-ssd dilation Hole算法解析

先转一篇大佬的博客论文阅读笔记:图像分割方法deeplab以及Hole算法解析 下面是caffe-ssd的vgg16输出后的变化,减少了一个pooling,stride1,然后下一层采用了 dilation方法,作用按上面博客说是 既想利用已经训练好的模…

理解Dilation convolution

论文:Multi-scale context aggregation with dilated convolutions 简单讨论下dilated conv,中文可以叫做空洞卷积或者扩张卷积。首先介绍一下dilated conv诞生背景[4],再解释dilated conv操作本身,以及应用。 首先是诞生背景&a…

卷积膨胀 Dilation

参考:卷积的dilation操作 如果我们设置的dilation0的话,效果如图: 蓝色为输入,绿色为输出,可见卷积核为3*3的卷积核 如果我们设置的是dilation1,那么效果如图: 蓝色为输入,绿色为输出,卷积核仍…

卷积核膨胀(dilation)解析

本文转自http://blog.csdn.net/tangwei2014和https://blog.csdn.net/jiongnima/article/details/69487519,转载目的便于自己查看学习 第一位大神解析: deeplab发表在ICLR 2015上。论文下载地址:Semantic Image Segmentation with Deep Conv…

【DL】卷积膨胀 Dilation

Backto DeepLearning Index dilation dilation 是对 kernel 进行膨胀,多出来的空隙用 0 padding。用于克服 stride 中造成的 失真问题。 对应关系是 k d = ( k − 1 ) d + 1 k_{d} = (k -1)\times d + 1 kd​

Pytorch中dilation(Conv2d)参数详解

目录 一、Conv2d 二、Conv2d中的dilation参数 一、Conv2d 首先我们看一下Pytorch中的Conv2d的对应函数(Tensor通道排列顺序是:[batch, channel, height, width]): torch.nn.Conv2d(in_channels, out_channels, kernel_size, str…

Linux的入门

文章目录 1 Linux应用场景2 Linux的应用领域2.1 个人桌面的应用2.2 服务器领域2.3 嵌入式领域 3 Linux 介绍4 Linux 和 Unix 的关系4.1 Linux 的由来:4.2 Linux 与 Unix 的关系 5 安装 vm 和CentOS5.1 基本说明5.2 网络连接的理解 6 虚拟机克隆7 虚拟机快照8 虚拟机…

Linux 快速入门到实战【一】

一、操作系统概述 1. 计算机原理 ​ 现代计算机大部分都是基于冯.诺依曼结构,该结构的核心思想是将程序和数据都存放在计算机中,按存储器的存储程序首地址执行程序的第一条指令,然后进行数据的处理计算。 ​ 计算机应包括运算器、控制器、…

linux快速入门 --- 常用指令 学习

目录 为什么要学Linux? Linux的安装 安装 使用finalshell连接虚拟机 了解一下Linux的目录结构(不需要记忆) Linux中常用的命令(重点) Linux命令初体验--几个常用命令 Linux命令格式 显示指定目录下的内容 ls和…

Linux命令快速入门

Linux命令初体验----01几个常用命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd[目录名]change directory切换目录4touch[文件名]touch如果文件不存在,新建文件5mkdir[目录名]make directory创建目录6rm[文件名…

如何快速入门并轻松简单的学习Linux?

首先,写这篇文章的初衷是写给那些想学习linux,并真正想用它做些有意义事情的人。希望能帮助初学者找到正确的学习linux思维或者方向。 1、做好思想准备 如果你想系统的学习linux,你必须做好思想准备。如果你真正想系统的学习linux&#xff0c…

linux基础-快速入门

主要内容介绍 1、LINUX操作系统安装及初始化配置(熟悉); 2、LINUX操作系统目录组成结构及文件级增删改查操作(重点); 3、LINUX操作系统用户、权限管理(重点); 4、开源软…

Linux快速入门打开你的学习之道

附Java/C/C/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50本(珍藏版) ②【算法…

快速入门:LINUX基础 ——教你使用 linux 操作

文章目录 一、LINUX介绍二、环境搭建三、如何在LINUX下做开发1.LINUX 中—vi的使用 四、LINUX常用初级指令介绍和使用五、Linux虚拟机和windows间的文件传输方式LINUX和WINDOWS文件共享 六、VMware虚拟接网络连接的三种方式LINUX虚拟机网络配置: 七、Linux线程概念引…

Linux 入门

Linux 入门 一、Linux简介 1.Linux介绍 Linux 是一种自由和开放源码的类 UNIX 操作系统。 Linux 英文解释为 Linux is not Unix。 Linux 是在 1991 由林纳斯托瓦兹在赫尔辛基大学上学时创立的,主要受到 Minix 和 Unix 思想的启发。 Linux 内核最初只是由芬兰人…

【Linux快速入门】文件目录操作

文章目录 概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令 3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 …