pytorch中F.avg_pool1d()和F.avg_pool2d()的区别有哪些

发布时间:2022-02-25 10:01:26 作者:小新
来源:亿速云 阅读:327

小编给大家分享一下pytorch中F.avg_pool1d()和F.avg_pool2d()的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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()的区别有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. Git管理项目,各类项目可以忽略的文件
  2. python整数的表示方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:pycharm如何利用pyspark实现远程连接spark集群

下一篇:React17启发式更新算法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》