PyTorch学习笔记:nn.AvgPool2d——二维平均池化操作

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

功能:在由多个平面组成的输入信号上应用2D平均池化操作,具体计算公式如下:
o u t ( N i , C i , h , w ) = 1 k H ∗ k W ∑ m = 0 k H − 1 ∑ m = 0 k H − 1 i n p u t ( N i , C i , s t r i d e [ 0 ] × h + m , s t r i d e [ 1 ] × w + n ) 假设输入尺寸是 ( N , C , H , W ) , 输出尺寸是 ( N , C , H o u t , W o u t ) , 池化核尺寸是 ( k H , k W ) out(N_i,C_i,h,w)=\frac{1}{kH*kW}\sum^{kH-1}_{m=0}\sum^{kH-1}_{m=0}input(N_i,C_i,stride[0]\times h+m,stride[1]\times w+n)\\ 假设输入尺寸是(N,C,H,W),输出尺寸是(N,C,H_{out},W_{out}),池化核尺寸是(kH,kW) out(Ni​,Ci​,h,w)=kH∗kW1​m=0∑kH−1​m=0∑kH−1​input(Ni​,Ci​,stride[0]×h+m,stride[1]×w+n)假设输入尺寸是(N,C,H,W),输出尺寸是(N,C,Hout​,Wout​),池化核尺寸是(kH,kW)
如果padding非零,则会在输入图像的四周隐式地填充0,可以通过指定参数count_include_pad来确定是否将该0纳入池化计算过程。

输入:

  • kernel_size:池化核的尺寸大小
  • stride:窗口的移动步幅,默认与kernel_size大小一致
  • padding:在两侧的零填充宽度大小
  • ceil_mode:设为True时,在计算输出形状的过程中采用向上取整的操作,否则,采用向下取整
  • count_include_pad:布尔类型,当为True时,将在平均池化计算中包括零填充,否则,不包括零填充
  • divisor_override:如果被指定,则除数会被代替成divisor_override。换句话说,如果不指定该变量,则平均池化的计算过程其实是在一个池化核内,将元素相加再除以池化核的大小,也就是divisor_override默认为池化核的高×宽;如果该变量被指定,则池化过程为将池化核内元素相加再除以divisor_override

注意:

  • 参数的kernel_sizestridepadding可以是:

    • 整数,这种情况下,高和宽尺寸相同
    • 元组,包含两个整数,第一个用于高度维度,第二个用于宽度维度
  • 输出形状的计算公式为:
    H o u t = ⌊ H i n + 2 × p a d d i n g [ 0 ] − k e r n e l _ s i z e [ 0 ] s t r i d e [ 0 ] + 1 ⌋ W o u t = ⌊ W i n + 2 × p a d d i n g [ 1 ] − k e r n e l _ s i z e [ 1 ] s t r i d e [ 1 ] + 1 ⌋ 其中, H i n 和 W i n 为输入的高和宽,默认向下取整 ( 可指定参数来修改取整规则 ) H_{out}=\lfloor{\frac{H_{in}+2\times padding[0]-kernel\_size[0]}{stride[0]}+1}\rfloor\\ W_{out}=\lfloor{\frac{W_{in}+2\times padding[1]-kernel\_size[1]}{stride[1]}+1}\rfloor\\ 其中,H_{in}和W_{in}为输入的高和宽,默认向下取整(可指定参数来修改取整规则) Hout​=⌊stride[0]Hin​+2×padding[0]−kernel_size[0]​+1⌋Wout​=⌊stride[1]Win​+2×padding[1]−kernel_size[1]​+1⌋其中,Hin​和Win​为输入的高和宽,默认向下取整(可指定参数来修改取整规则)

  • padding大小要小于池化核的尺寸大小

代码案例

一般用法

import torch
from torch import nn
img=torch.arange(16).reshape(1,1,4,4)
# 池化核和池化步长均为2
pool=nn.AvgPool2d(2,stride=2)
img_2=pool(img)
print(img)
print(img_2)

输出

# 原图像
tensor([[[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11],[12, 13, 14, 15]]]])
# 池化后图像,长宽均为原来的一半
tensor([[[[ 2,  4],[10, 12]]]])

ceil_mode设为True与Fasle的区别

import torch
from torch import nn
img=torch.arange(20,dtype=torch.float).reshape(1,1,4,5)
pool_f=nn.AvgPool2d(2,stride=2,padding=0,ceil_mode=False)
pool_t=nn.AvgPool2d(2,stride=2,padding=0,ceil_mode=True)
img_2=pool_f(img)
img_3=pool_t(img)
print(img)
print(img_2)
print(img_3)

输出

# 原图像
tensor([[[[ 0.,  1.,  2.,  3.,  4.],[ 5.,  6.,  7.,  8.,  9.],[10., 11., 12., 13., 14.],[15., 16., 17., 18., 19.]]]])
# 默认情况,ceil_mode为False
tensor([[[[ 3.,  5.],[13., 15.]]]])
# ceil_mode为True
tensor([[[[ 3.0000,  5.0000,  6.5000],[13.0000, 15.0000, 16.5000]]]])
# 由于5不能被2整除,所以一个下取整,一个上取整

padding设与不设的区别

import torch
from torch import nn
img=torch.arange(16,dtype=torch.float).reshape(1,1,4,4)
pool_t=nn.AvgPool2d(2,stride=2,padding=1)
pool_f=nn.AvgPool2d(2,stride=2)
img_2=pool_t(img)
img_3=pool_f(img)
print(img)
print(img_2)
print(img_3)

输出

# 原图
tensor([[[[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.]]]])
# 填充宽度为1,默认填充的0会被用于池化计算
tensor([[[[0.0000, 0.7500, 0.7500],[3.0000, 7.5000, 4.5000],[3.0000, 6.7500, 3.7500]]]])
# 未填充结果
tensor([[[[ 2.5000,  4.5000],[10.5000, 12.5000]]]])
# 填充后的图像经过池化运算得到的图像尺寸可以用上面的公式计算出来

count_include_pad设为True与False的区别

import torch
from torch import nn
img=torch.arange(16,dtype=torch.float).reshape(1,1,4,4)
pool_t=nn.AvgPool2d(2,stride=2,padding=1,count_include_pad=True)
pool_f=nn.AvgPool2d(2,stride=2,padding=1,count_include_pad=False)
img_2=pool_t(img)
img_3=pool_f(img)
print(img)
print(img_2)
print(img_3)

输出

# 原图
tensor([[[[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.]]]])
# 填充宽度为1,count_include_pad为True(默认情况)
# 填充的0被用于池化计算
tensor([[[[0.0000, 0.7500, 0.7500],[3.0000, 7.5000, 4.5000],[3.0000, 6.7500, 3.7500]]]])
# 填充的0未被用于池化计算
tensor([[[[ 0.0000,  1.5000,  3.0000],[ 6.0000,  7.5000,  9.0000],[12.0000, 13.5000, 15.0000]]]])

divisor_override设与未设的区别

import torch
from torch import nn
img=torch.arange(16,dtype=torch.float).reshape(1,1,4,4)
pool_1=nn.AvgPool2d(2,stride=2)
pool_d1=nn.AvgPool2d(2,stride=2,divisor_override=2)
pool_d2=nn.AvgPool2d(2,stride=2,divisor_override=3)
img_1=pool_1(img)
img_2=pool_d1(img)
img_3=pool_d2(img)
print(img)
print(img_1)
print(img_2)
print(img_3)

输出

# 原图像
tensor([[[[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.]]]])
# 未设置divisor_override,此时是普通的平均池化操作
tensor([[[[ 2.5000,  4.5000],[10.5000, 12.5000]]]])
# divisor_override设置为2,以左上角四个元素为例
# 池化后第一个元素为原图左上角四个元素相加除以2
tensor([[[[ 5.,  9.],[21., 25.]]]])
# divisor_override设置为3,
# 即四个元素相加除以3
tensor([[[[ 3.3333,  6.0000],[14.0000, 16.6667]]]])

官方文档

torch.nn.AvgPool2d():https://pytorch.org/docs/stable/generated/torch.nn.AvgPool2d.html?highlight=avgpool2d#torch.nn.AvgPool2d

nn.AvgPool2d——二维平均池化操作相关推荐

  1. 【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战

    1 深层卷积神经网络概述 1.1 深层卷积神经网络模型结构图 1.1.1 深层卷积神经网络的正向结构构成剖析 输入层,将每个像素作为一个特征节点输入网络. 卷积层:由多个滤波器组合而成. 池化层:将卷 ...

  2. 39_上下采样、MaxPool2d、AvgPool2d、ReLU案例、二维最大池化层和平均池化层、填充和步幅、多通道

    1.34.PyTorch Down/up sample (pytorch上下采样) 1.34.1. 首先介绍下采样 1.34.1.1. MaxPool2d案例 1.34.1.2. AvgPool2d案 ...

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

    torch 池化操作 1 池化操作 2 类型 2.1 MaxPool2d() 2.2 MaxUnPool2d() 2.3 AvgPool2d() 2.4 FractionalMaxPool2d() 2 ...

  4. 【综述】盘点卷积神经网络中的池化操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 池化操作(Pooling)是CNN中非常常见的一种操作,池化操作通 ...

  5. 双线性池化_卷积神经网络中的各种池化操作

    池化操作(Pooling)是CNN中非常常见的一种操作,Pooling层是模仿人的视觉系统对数据进行降维,池化操作通常也叫做子采样(Subsampling)或降采样(Downsampling),在构建 ...

  6. TensorFlow实现卷积、池化操作

    1.调用tf.nn.conv2d()实现卷积 首先是调用卷积函数实现卷积操作: 这里说明一下conv2d的定义及参数含义: 参考 [定义:] tf.nn.conv2d (input, filter, ...

  7. 卷积神经网络中的各种池化操作

    参考:https://www.cnblogs.com/pprp/p/12456403.html 池化操作(Pooling)是CNN中非常常见的一种操作,Pooling层是模仿人的视觉系统对数据进行降维 ...

  8. 图神经网络的池化操作

    图神经网络有两个层面的任务:一个是图层面(graph-level),一个是节点(node-level)层面,图层面任务就是对整个图进行分类或者回归(比如分子分类),节点层面就是对图中的节点进行分类回归 ...

  9. 炼丹侠必知的9大池化操作​汇总

    池化Pooling是卷积神经网络中常见的一种操作,Pooling层是模仿人的视觉系统对数据进行降维,其本质是降维.在卷积层之后,通过池化来降低卷积层输出的特征维度,减少网络参数和计算成本的同时,降低过 ...

最新文章

  1. 终结谷歌AutoML的真正杀手!Saleforce开源TransmogrifAI
  2. Codeforces-868C. Qualification Rounds(状压)
  3. 打造高端网站应该具备哪些品质?
  4. 还原sql server数据库时,无法获得对数据库的独占访问权
  5. C++语言之Lambda函数与表达式
  6. halcon的算子清点:Chapter 7 :Image
  7. mysql每秒最多能插入多少条数据 ? 死磕性能压测
  8. 编译linux内核分区,Ubuntu编译内核及grub的一些笔记
  9. html5 block调用html,HTML: blockquote 标签
  10. (转载)c/c++笔试面试题(2)
  11. ReedShepp与Dubins path的matlab实现
  12. puppet运行慢的一个小例子
  13. 用javascript动态调整iframe高度
  14. redis 客户端_你在使用什么 Redis 客户端工具?
  15. SQLyog创建表示的bug
  16. Spark内核解析之三:Spark 通讯架构
  17. 框架设计--第十章 MyBatis与Spring的整合--习题答案
  18. CUDA11.1安装AlphaPose
  19. linux内核开启otg,OTG驱动分析(一)
  20. 动手学深度学习笔记3.4+3.5+3.6+3.7

热门文章

  1. Serverless 学习 01 认识 Serverless 、基本应用
  2. 简单订单表模拟批量写入
  3. jqGrid 解决分页跳转无效问题
  4. SVN 命令行常用命令
  5. 在ASP.NET项目中使用XPO的最佳准则
  6. Java DB loadBalance设计
  7. 2022年广东省房地产经纪人(房地产经纪业务操作)练习题及答案
  8. GPS 冷启动 热启动 温启动 的区别
  9. 毫无基础的人如何入门Python这个编程语言?
  10. 2019年最佳WordPress会员插件