• 售前

  • 售后

热门帖子
入门百科

对于torch.nn.AdaptiveAvgPool2d()自顺应均匀池化函数的一些明确

[复制链接]
春天到了 显示全部楼层 发表于 2022-1-16 18:42:55 |阅读模式 打印 上一主题 下一主题
AdaptiveAvgPool2d()先容

torch.nn.AdaptiveAvgPool2d()继承两个参数,分别为输出特性图的长和宽,其通道数前后不发生厘革。
vgg在卷积层和全毗连层的接壤处使用了torch.nn.AdaptiveAvgPool2d((7,7))
看以下代码:
  1. class AdaptiveAvgPool2d(_AdaptiveAvgPoolNd):
  2.     """Applies a 2D adaptive average pooling over an input signal composed of several input planes.
  3.     The output is of size H x W, for any input size.
  4.     The number of output features is equal to the number of input planes.
  5.     Args:
  6.         output_size: the target output size of the image of the form H x W.
  7.                      Can be a tuple (H, W) or a single H for a square image H x H.
  8.                      H and W can be either a ``int``, or ``None`` which means the size will
  9.                      be the same as that of the input.
  10.     Examples:
  11.         >>> # target output size of 5x7
  12.         >>> m = nn.AdaptiveAvgPool2d((5,7))
  13.         >>> input = torch.randn(1, 64, 8, 9)
  14.         >>> output = m(input)
  15.         >>> # target output size of 7x7 (square)
  16.         >>> m = nn.AdaptiveAvgPool2d(7)
  17.         >>> input = torch.randn(1, 64, 10, 9)
  18.         >>> output = m(input)
  19.         >>> # target output size of 10x7
  20.         >>> m = nn.AdaptiveMaxPool2d((None, 7))
  21.         >>> input = torch.randn(1, 64, 10, 9)
  22.         >>> output = m(input)
  23.     """
  24.     @weak_script_method
  25.     def forward(self, input):
  26.         return F.adaptive_avg_pool2d(input, self.output_size)
复制代码
AdaptiveAvgPool2d()
对由多个输入平面构成的输入信号应用二维自顺应匀称池化。
对于任何输入巨细,图像的长宽输出巨细为H x W;输出特性的数目便是输入数目(即通道数)。
此中,output_size代表格式为H x W的图像的目标输出巨细。
AdaptiveAvgPool2d((H,W))代表输出长为H,宽为W的图像。
  1. # target output size of 5x7
  2. import torch
  3. import torch.nn as nn
  4. m = nn.AdaptiveAvgPool2d((5,7))
  5. input = torch.randn(1, 64, 8, 9)
  6. output = m(input)
  7. output.shape
  8. #运行结果:torch.Size([1, 64, 5, 7])
复制代码
若只输入一个参数即AdaptiveAvgPool2d((H)) 相称于 AdaptiveAvgPool2d((H,H)) 即输出长和宽均为H的图像
  1. # target output size of 7x7 (square)
  2. import torch
  3. import torch.nn as nn
  4. m = nn.AdaptiveAvgPool2d((7))
  5. input = torch.randn(1, 64, 10, 9)
  6. output = m(input)
  7. output.shape
  8. #运行结果:torch.Size([1, 64, 7, 7])
复制代码
若H或W是None,这意味着巨细将与输入雷同。
  1. # target output size of 10x7
  2. import torch
  3. import torch.nn as nn
  4. m = nn.AdaptiveMaxPool2d((None, 7))
  5. input = torch.randn(1, 64, 10, 9)
  6. output = m(input)
  7. output.shape
  8. #运行结果:torch.Size([1, 64, 10, 7])
复制代码
固然,输出维度H、W也可以大于原始维度,但是这种方法通常效果不佳。
  1. # target output size of 80×60
  2. import torch
  3. import torch.nn as nn
  4. m = nn.AdaptiveMaxPool2d((80, 60))
  5. input = torch.randn(1, 64, 10, 9)
  6. output = m(input)
  7. output.shape
  8. #运行结果:torch.Size([1, 64, 80, 60])
复制代码
自己的看法

什么时间使用AdaptiveAvgPool2d()?

我以为在我们构造模子的时间,AdaptiveAvgPool2d()的位置一样寻常在卷积层和全毗连层的交汇处,以便确定输出到Linear层的巨细。下图为VGG中AdaptiveAvgPool2d()的使用。

AdaptiveAvgPool2d()的参数应该怎样选取?

AdaptiveAvgPool2d()中H、W的选取与【我们的图的初始巨细(长宽)和池化层的数目有关系】,也就是与【颠末多个卷积池化使用后的图像长宽】有关,在实验中我发现在参数H、W 比 输入图像的长宽 小 的情况下效果更好。

好比使用cifar-10举行练习,开始输入的图像为32×32×3(长×宽×通道数),颠末三层卷积(通道数均为64)和池化(默认2×2,,每颠末一次池化长宽各缩减为先前的两倍),图像变为(4×4×3),这时要把图像放入全毗连层练习之前,我们最好对图像举行AdaptiveAvgPool2d()处置惩罚,以便使得全毗连层的维度得到方便的输入(由于假如我们改变池化层的数目,长宽也随之改变)。
假云云时我们仍旧使用AdaptiveAvgPool2d((7,7)),效果不会太好(7

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作