pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作


Posted in Python onMay 22, 2021

F.avg_pool1d()数据是三维输入

input维度: (batch_size,channels,width)channel可以看成高度

kenerl维度:(一维:表示width的跨度)channel和输入的channel一致可以认为是矩阵的高度

假设kernel_size=2,则每俩列相加求平均,stride默认和kernel_size保持一致,越界则丢弃(下面表示1,2列和3,4列相加求平均)

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input)
m = F.avg_pool1d(input,kernel_size=2)
m

tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[1.0000, 1.0000],
         [1.0000, 1.0000],
         [0.0000, 0.5000],
         [1.0000, 1.0000],
         [1.0000, 1.0000]]])

假设kenerl_size=3,表示前3列相加求平均,后面的不足3列丢弃

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input)
m = F.avg_pool1d(input,kernel_size=3)
m
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[1.],
         [1.],
         [0.],
         [1.],
         [1.]]])

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input)
m = F.avg_pool1d(input,kernel_size=4)
m
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[1.0000],
         [1.0000],
         [0.2500],
         [1.0000],
         [1.0000]]])

假设stride=1每次移动一个步伐

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input)
m = F.avg_pool1d(input,kernel_size=2,stride=1)
m
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[1.0000, 1.0000, 1.0000, 1.0000],
         [1.0000, 1.0000, 1.0000, 1.0000],
         [0.0000, 0.0000, 0.5000, 1.0000],
         [1.0000, 1.0000, 1.0000, 1.0000],
         [1.0000, 1.0000, 1.0000, 1.0000]]])
 
input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input)
m = F.avg_pool1d(input,kernel_size=4,stride=1)
m
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[1.0000, 1.0000],
         [1.0000, 1.0000],
         [0.2500, 0.5000],
         [1.0000, 1.0000],
         [1.0000, 1.0000]]])

F.avg_pool2d()数据是四维输入

input维度: (batch_size,channels,height,width)

kenerl维度:(二维:表示width的跨度)channel和输入的channle一致,如果数据是三维,则channel为1.(如果只写一个数n,kenerl=(n,n))

stride默认和kenerl一致,这是个二维的,所以在height和width上均和kenerl一致,越界同样丢弃。

跟cnn卷积一致

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input.size())
print(input)
m = F.avg_pool2d(input,kernel_size=(4,4))
m
torch.Size([1, 5, 5])
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[0.8125]]])

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input.size())
print(input)
m = F.avg_pool2d(input,kernel_size=(4,4),stride=1)
m
torch.Size([1, 5, 5])
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[0.8125, 0.8750],
         [0.8125, 0.8750]]])

如果求列的平均kenerl=(1,5),此时默认stride=(1,5)

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input.size())
print(input)
m = F.avg_pool2d(input,kernel_size=(1,5))
m
torch.Size([1, 5, 5])
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[1.0000],
         [1.0000],
         [0.4000],
         [1.0000],
         [1.0000]]])

如果求行的平均kenerl=(5,1),此时默认stride=(5,1),用卷积的概念取思考

input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
print(input.size())
print(input)
m = F.avg_pool2d(input,kernel_size=(5,1))
m
torch.Size([1, 5, 5])
tensor([[[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [0., 0., 0., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
tensor([[[0.8000, 0.8000, 0.8000, 1.0000, 1.0000]]])

对于四维的数据,channel默认和输入一致

input=torch.randn(10,3,4,4)
m=F.avg_pool2d(input,(4,4))
print(m.size())
torch.Size([10, 3, 1, 1])

补充:PyTorch中AdaptiveAvgPool函数解析

自适应池化(AdaptiveAvgPool1d):

对输入信号,提供1维的自适应平均池化操作 对于任何输入大小的输入,可以将输出尺寸指定为H*W,但是输入和输出特征的数目不会变化。

torch.nn.AdaptiveAvgPool1d(output_size)
#output_size:输出尺寸

对输入信号,提供1维的自适应平均池化操作 对于任何输入大小的输入,可以将输出尺寸指定为H*W,但是输入和输出特征的数目不会变化。

# target output size of 5
m = nn.AdaptiveAvgPool1d(5)
input = autograd.Variable(torch.randn(1, 64, 8))
output = m(input)

自适应池化(AdaptiveAvgPool2d):

class torch.nn.AdaptiveAvgPool2d(output_size)

对输入信号,提供2维的自适应平均池化操作 对于任何输入大小的输入,可以将输出尺寸指定为H*W,但是输入和输出特征的数目不会变化。

参数:

output_size: 输出信号的尺寸,可以用(H,W)表示H*W的输出,也可以使用耽搁数字H表示H*H大小的输出

# target output size of 5x7
m = nn.AdaptiveAvgPool2d((5,7))
input = autograd.Variable(torch.randn(1, 64, 8, 9))
# target output size of 7x7 (square)
m = nn.AdaptiveAvgPool2d(7)
input = autograd.Variable(torch.randn(1, 64, 10, 9))
output = m(input)

自适应池化的数学解释:

pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作

pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python制作游戏外挂
Jan 04 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
基于树莓派的语音对话机器人
Jun 17 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
Python类super()及私有属性原理解析
Jun 15 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
python实战之用emoji表情生成文字
May 08 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
用python实现监控视频人数统计
Python基础之进程详解
如何在C++中调用Python
May 21 #Python
python 定义函数 返回值只取其中一个的实现
May 21 #Python
Python+Appium实现自动抢微信红包
写好Python代码的几条重要技巧
windows安装python超详细图文教程
You might like
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
django自定义模板标签过程解析
2019/12/14 Python
python 实现按对象传值
2019/12/26 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
python单例设计模式实现解析
2020/01/07 Python
Python列表解析操作实例总结
2020/02/26 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
python3.5的包存放的具体路径
2020/08/16 Python
深入探究HTML5的History API
2015/07/09 HTML / CSS
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
网络安全方面的面试题
2015/11/04 面试题
战友聚会邀请函
2014/01/18 职场文书
专家推荐信怎么写
2015/03/25 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
python保存图片的四个常用方法
2022/02/28 Python