PyTorch nn.AdaptiveAvgPool2d 自适应池化

PyTorch 中 nn.AdaptiveAvgPool2dnn.AvgPool2d 功能一样都是平均池化, 但接收的参数不一样


AvgPool2d:

  • 滑动窗口的大小 kernel_size
  • 填充 padding
  • 步长 stride

AdaptiveAvgPool2d: 仅需要指定输出特征图的尺寸


以特征图减半的池化为例

输入数据

import torch

inp = torch.arange(36, dtype=torch.float).view(1, 6, 6)
print(inp)
# tensor([[[ 0.,  1.,  2.,  3.,  4.,  5.],
#          [ 6.,  7.,  8.,  9., 10., 11.],
#          [12., 13., 14., 15., 16., 17.],
#          [18., 19., 20., 21., 22., 23.],
#          [24., 25., 26., 27., 28., 29.],
#          [30., 31., 32., 33., 34., 35.]]])

实例化两种池化操作

from torch import nn

# 减半后的尺寸为 3*3
p1 = nn.AdaptiveAvgPool2d((3, 3))

# 常规做法, 没有填充
p2 = nn.AvgPool2d(kernel_size=2, stride=2)

执行池化

print("AdaptiveAvgPool2d:", p1(inp), sep="\n")

print("AvgPool2d:", p2(inp), sep="\n")

打印

AdaptiveAvgPool2d:
tensor([[[ 3.5000,  5.5000,  7.5000],
         [15.5000, 17.5000, 19.5000],
         [27.5000, 29.5000, 31.5000]]])
AvgPool2d:
tensor([[[ 3.5000,  5.5000,  7.5000],
         [15.5000, 17.5000, 19.5000],
         [27.5000, 29.5000, 31.5000]]])

两种操作结果一致


如果要将一张特征图池化到一个标量(整个所有特征图被池化为向量), 可以使用 nn.AdaptiveAvgPool2d(1), 只有一个 int 参数等价于 (1, 1)

你可能感兴趣的:(PyTorch,pytorch)