在 pytorch 中,池化层(Pooling)有两种操作方式,一种是手动设计,另一种是自适应池化。
一、手动设计
池化层操作,一般有最大值(max)池化和均值(avg)池化,而根据尺寸又有一维,二维,三维。所以,手动设计的池化层有6种函数:
AvgPool1d
AvgPool2d
AvgPool3d
MaxPool1d
MaxPool2d
MaxPool3d
以 AvgPool2d 为例,求一个张量的平均二维池化层:
import torch
import torch.nn as nn
input = torch.rand(1, 3, 5, 5)
avgpool = nn.AvgPool2d(kernel_size=3, stride=1, padding=0)
out1 = avgpool(input)
print(out1.shape)
输出:
torch.Size([1, 3, 3, 3])
从例子中可以看出,手动设计的池化层,要根据自己想要得到的输出来设置卷积核的大小,步长以及边界补充。该函数一般混合在卷积层中使用。
二、自适应池化
同样地,自适应池化也有分均值和最大值,分一维,二维和三维。也有6个函数:
AdaptiveAvgPool1d
AdaptiveAvgPool2d
AdaptiveAvgPool3d
AdaptiveMaxPool1d
AdaptiveMaxPool2d
AdaptiveMaxPool3d
同样地,以AdaptiveAvgPool2d为例子:
import torch
import torch.nn as nn
adaavgpool = nn.AdaptiveAvgPool2d(3)
out2 = adaavgpool(input)
print(out2.shape)
adaavgpool = nn.AdaptiveAvgPool2d([2, 3])
out2 = adaavgpool(input)
print(out2.shape)
输出为:
torch.Size([1, 3, 3, 3])
torch.Size([1, 3, 2, 3])
从例子中可以看出,自适应池化不需要设计计算输出的大小,输入的参数是输出的大小,所以不需要自行设计,就可以得到想要的输入大小,该前提下是输出不能比输入大。该自适应池化函数一般应用在卷积层后面,把卷积层降维到1,即nn.AdaptiveAvgPool2d(1),然后通过 x=x.view(1) 更改形状,左后输入到全连接层。