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 02 Python
2019 Python最新面试题及答案16道题
Apr 11 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Django中的cookie和session
Aug 27 Python
Django app配置多个数据库代码实例
Dec 17 Python
Python实现aes加密解密多种方法解析
May 15 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
python爬虫调度器用法及实例代码
Nov 30 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
如何删除多级目录
2006/10/09 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
Javascript注入技巧
2007/06/22 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
SVM基本概念及Python实现代码
2017/12/27 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
什么是python的函数体
2020/06/19 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
医院后勤自我鉴定
2013/10/13 职场文书
应届生污水处理求职信
2013/11/06 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
工作表扬信
2015/01/17 职场文书
人民币符号
2022/02/17 杂记