PyTorch 的 Pooling 和 UnPooling函数中的 indices 参数:nn.MaxPool2d/nn.MaxUnpool2d、F.max_pool2d/F.max_unpool2d

本文主要是介绍PyTorch 的 Pooling 和 UnPooling函数中的 indices 参数:nn.MaxPool2d/nn.MaxUnpool2d、F.max_pool2d/F.max_unpool2d,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇博文主要介绍 PyTorch 的 MaxPooling 和 MAxUnPooling 函数中涉及到的 indices 参数。

indices 是“索引”的意思,对于一些结构对称的网络模型,上采样和下采样的结构往往是对称的,我们可以在下采样做 MaxPooling 的时候记录下来最大值所在的位置,当做上采样的时候把最大值还原到其对应的位置,然后其余的位置补 0 。

indices 参数的作用就是保存 MaxPooling 操作时最大值位置的索引。

如下图所示:

在这里插入图片描述
PyTorch 的 torch.nn 和 torch.nn.functional 模块中均有实现 Pooling 和 UnPooling 的 api ,它们的作用和效果是完全相同的。

1、nn.MaxPool2d 和 nn.MaxUnpool2d

使用 nn.MaxPool2d 和 nn.MaxUnpool2d 时要先实例化,事实上 nn 模块下面的函数都是如此(需要先实例化),比如 nn.Conv

import torch
from torch import nn# 使用 nn.MaxPool2d 和 nn.MaxUnpool2d 时要先实例化
pool = nn.MaxPool2d(kernel_size=2, stride=2, return_indices=True)
unpool = nn.MaxUnpool2d(kernel_size=2, stride=2)data = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)
pool_out, indice = pool(data)
unpool_out = unpool(input=pool_out, indices=indice)print("pool_out = ", pool_out)
print("indice = ", indice)
print("unpool_out = ", unpool_out)"""
pool_out =  tensor([[[[ 6.,  8.],[14., 16.]]]])
indice =  tensor([[[[ 5,  7],[13, 15]]]])
unpool_out =  tensor([[[[ 0.,  0.,  0.,  0.],[ 0.,  6.,  0.,  8.],[ 0.,  0.,  0.,  0.],[ 0., 14.,  0., 16.]]]])
"""

2、F.max_pool2d 和 F.max_unpool2d

使用 F.max_pool2d 和 F.max_unpool2d 时不需要实例化,可以直接使用。

import torch
import torch.nn.functional as Fdata = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)
pool_out, indice = F.max_pool2d(input=data, kernel_size=2, stride=2, return_indices=True)
unpool_out = F.max_unpool2d(input=pool_out, indices=indice, kernel_size=2, stride=2)print("pool_out = ", pool_out)
print("indice = ", indice)
print("unpool_out = ", unpool_out)"""
pool_out =  tensor([[[[ 6.,  8.],[14., 16.]]]])
indice =  tensor([[[[ 5,  7],[13, 15]]]])
unpool_out =  tensor([[[[ 0.,  0.,  0.,  0.],[ 0.,  6.,  0.,  8.],[ 0.,  0.,  0.,  0.],[ 0., 14.,  0., 16.]]]])
"""

可以看到,nn.MaxPool2d / nn.MaxUnpool2d 和 F.max_pool2d / F.max_unpool2d 的作用和输出结果完全相同。

3、使用 Pooling 和 Conv2d 实现上/下采样的区别和产生的影响

使用 Pooling 和 Conv2d 实现上/下采样的区别主要体现在对奇数大小的特征图的处理中,以特征图大小为 65*65为例。

使用 nn.MaxPool2d 和 F.max_pool2d 实现下采样时,得到的特征图大小是 32*32,上采样得到的特征图大小是 64*64
使用 nn.Conv2d 实现下采样时,得到的特征图大小是 33*33;再使用nn.ConvTranspose2d 上采样得到的特征图大小是 66*66

在很多对称的网络结构中(如 UNet、SegNet),需要对上采样和下采样的对应的特征图进行大小对齐。

若网络中间某个特征图大小是 65 ,不论使用哪种上/下采样策略,得到的特征图大小必然不可能还是64(不可能是奇数)。此时就要考虑64和66的区别了。

(1)如果使用 64 * 64 大小的特征图,则需要进行 padding 得到 65 * 65 的特征图。但padding操作可能会导致在训练和推理过程中的不确定性问题。

(2)如果使用 66 * 66 大小的特征图,则只需要进行切片得到 65 * 65 的特征图。该操作是更靠谱的。

因此,个人建议使用 nn.Conv2d 和其他函数实现采样操作。

这篇关于PyTorch 的 Pooling 和 UnPooling函数中的 indices 参数:nn.MaxPool2d/nn.MaxUnpool2d、F.max_pool2d/F.max_unpool2d的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/342448

相关文章

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor