前几篇我们介绍了CNN的卷积层,今天我们补充一下CNN的池化层。
传送门:
卷积神经网络(CNN)
卷积核的基本概况
关于tensorflow与pytorch里的卷积层
理解转置卷积与空洞卷积
回顾池化层
池化层很久之前已经介绍了,这里回顾复习一下。池化层一般是夹在卷积层中间,用于数据压缩和参数压缩,减少过拟合,提高所提取特征的鲁棒性,同时可以提高计算速度。
池化通常有两种——MAX和AVERAGE。最常用的是最大池化,下图是Max池化的一个示例:
想象一下,对于一些像素很大的图片,在每个区域进行最大池化操作,那么数字越大,代表越容易被探测到,就可以作为该区域的特定特征。所以最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。
而且,池化层还有一个有意思的点,就是只需要指定超参数,比如步长,核大小,而没有参数需要学习。
池化层的计算机实现
下面我们列举一下pytorch的池化层实现,tensorflow的差不多,就不过多介绍了。
首先,是最大池化及其反池化过程:
from torch.nn import MaxPool1d,MaxPool2d,MaxPool3d
from torch.nn import MaxUnpool1d,MaxUnpool2d,MaxUnpool3d
以2D为示例:
m = nn.MaxPool2d(2, stride=2, return_indices=True)
input = torch.randn(1, 1, 4, 4)
output,indices = m(input)
output
第一个参数是核大小,stride即步长,indices是返回输入tensor每个区域最大值所对应的索引。反池化操作指定相同的参数即可:
n = MaxUnpool2d(2,stride=2)
n(output,indices)
如果不想恢复原状,可以指定恢复的形状:
n = MaxUnpool2d(2,stride=2)
n(output,indices,output_size=torch.Size([1, 1, 5, 5]))
平均池化实现过程也相当简单:
from torch.nn import AvgPool1d,AvgPool2d,AvgPool3d
input = torch.tensor([[[[ 1., 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]]])
m = nn.AvgPool2d(2, stride=2)
output = m(input)
output
pytorch里面没有直接针对平均池化层的反池化过程,不过可以利用上采样恢复:
r = nn.Upsample(scale_factor=2, mode='nearest')
r(output)/4
除此之外,pytorch还提供了更加灵活的池化层——自适应池化层
from torch.nn import AdaptiveAvgPool1d
from torch.nn import AdaptiveAvgPool2d
from torch.nn import AdaptiveAvgPool3d
from torch.nn import AdaptiveMaxPool1d
from torch.nn import AdaptiveMaxPool2d
from torch.nn import AdaptiveMaxPool3d
它可以让用户指定输出形状,之后会根据输入的张量进行自动调整:
m = nn.AdaptiveAvgPool2d((2,3))
input = torch.randint(1,10,(1,1,4,6)).to(torch.float32)
output = m(input)
output.shape
最后,还有两个不常用的池化层:
from torch.nn import FractionalMaxPool2d
from torch.nn import LPPool2d
LP是对输入信号做幂平均池化操作:
当p为无穷大的时候时,等价于最大池化操作,当p=1时,等价于平均池化操作。