PyTorch的自适应池化Adaptive Pooling实例


Posted in Python onJanuary 03, 2020

简介

自适应池化Adaptive Pooling是PyTorch含有的一种池化层,在PyTorch的中有六种形式:

自适应最大池化Adaptive Max Pooling:

torch.nn.AdaptiveMaxPool1d(output_size)
torch.nn.AdaptiveMaxPool2d(output_size)
torch.nn.AdaptiveMaxPool3d(output_size)

自适应平均池化Adaptive Average Pooling:

torch.nn.AdaptiveAvgPool1d(output_size)
torch.nn.AdaptiveAvgPool2d(output_size)
torch.nn.AdaptiveAvgPool3d(output_size)

具体可见官方文档。

官方给出的例子:
>>> # target output size of 5x7
>>> m = nn.AdaptiveMaxPool2d((5,7))
>>> input = torch.randn(1, 64, 8, 9)
>>> output = m(input)
>>> output.size()
torch.Size([1, 64, 5, 7])

>>> # target output size of 7x7 (square)
>>> m = nn.AdaptiveMaxPool2d(7)
>>> input = torch.randn(1, 64, 10, 9)
>>> output = m(input)
>>> output.size()
torch.Size([1, 64, 7, 7])

>>> # target output size of 10x7
>>> m = nn.AdaptiveMaxPool2d((None, 7))
>>> input = torch.randn(1, 64, 10, 9)
>>> output = m(input)
>>> output.size()
torch.Size([1, 64, 10, 7])

Adaptive Pooling特殊性在于,输出张量的大小都是给定的output_size output\_sizeoutput_size。例如输入张量大小为(1, 64, 8, 9),设定输出大小为(5,7),通过Adaptive Pooling层,可以得到大小为(1, 64, 5, 7)的张量。

原理

PyTorch的自适应池化Adaptive Pooling实例

>>> inputsize = 9
>>> outputsize = 4

>>> input = torch.randn(1, 1, inputsize)
>>> input
tensor([[[ 1.5695, -0.4357, 1.5179, 0.9639, -0.4226, 0.5312, -0.5689, 0.4945, 0.1421]]])

>>> m1 = nn.AdaptiveMaxPool1d(outputsize)
>>> m2 = nn.MaxPool1d(kernel_size=math.ceil(inputsize / outputsize), stride=math.floor(inputsize / outputsize), padding=0)
>>> output1 = m1(input)
>>> output2 = m2(input)

>>> output1
tensor([[[1.5695, 1.5179, 0.5312, 0.4945]]]) torch.Size([1, 1, 4])
>>> output2
tensor([[[1.5695, 1.5179, 0.5312, 0.4945]]]) torch.Size([1, 1, 4])

通过实验发现:

PyTorch的自适应池化Adaptive Pooling实例

下面是Adaptive Average Pooling的c++源码部分。

template <typename scalar_t>
 static void adaptive_avg_pool2d_out_frame(
      scalar_t *input_p,
      scalar_t *output_p,
      int64_t sizeD,
      int64_t isizeH,
      int64_t isizeW,
      int64_t osizeH,
      int64_t osizeW,
      int64_t istrideD,
      int64_t istrideH,
      int64_t istrideW)
 {
  int64_t d;
 #pragma omp parallel for private(d)
  for (d = 0; d < sizeD; d++)
  {
   /* loop over output */
   int64_t oh, ow;
   for(oh = 0; oh < osizeH; oh++)
   {
    int istartH = start_index(oh, osizeH, isizeH);
    int iendH  = end_index(oh, osizeH, isizeH);
    int kH = iendH - istartH;

    for(ow = 0; ow < osizeW; ow++)
    {
     int istartW = start_index(ow, osizeW, isizeW);
     int iendW  = end_index(ow, osizeW, isizeW);
     int kW = iendW - istartW;

     /* local pointers */
     scalar_t *ip = input_p  + d*istrideD + istartH*istrideH + istartW*istrideW;
     scalar_t *op = output_p + d*osizeH*osizeW + oh*osizeW + ow;

     /* compute local average: */
     scalar_t sum = 0;
     int ih, iw;
     for(ih = 0; ih < kH; ih++)
     {
      for(iw = 0; iw < kW; iw++)
      {
       scalar_t val = *(ip + ih*istrideH + iw*istrideW);
       sum += val;
      }
     }

     /* set output to local average */
     *op = sum / kW / kH;
    }
   }
  }
}

以上这篇PyTorch的自适应池化Adaptive Pooling实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
Python 爬虫图片简单实现
Jun 01 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
Jun 15 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
Python神奇的内置函数locals的实例讲解
Feb 22 Python
python networkx 根据图的权重画图实现
Jul 10 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
简单了解Python多态与属性运行原理
Jun 15 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
python非标准时间的转换
Jul 25 Python
Python中的 Set 与 dict
Mar 13 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 #Python
pytorch AvgPool2d函数使用详解
Jan 03 #Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
Jan 03 #Python
Python基础之函数原理与应用实例详解
Jan 03 #Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 #Python
Python基础之高级变量类型实例详解
Jan 03 #Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 #Python
You might like
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
PHP curl使用实例
2015/07/02 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
使用python实现tcp自动重连
2017/07/02 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
游戏商店:Eneba
2020/04/25 全球购物
Java的五个基础面试题
2016/02/26 面试题
Prototype如何更新局部页面
2013/03/03 面试题
介绍下Java中==和equals的区别
2013/09/01 面试题
不假外出检讨书
2014/01/27 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
施工安全责任协议书
2016/03/23 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS