CNN的池化层

前几篇我们介绍了CNN的卷积层,今天我们补充一下CNN的池化层。

传送门:

卷积神经网络(CNN)

卷积核的基本概况

关于tensorflow与pytorch里的卷积层

理解转置卷积与空洞卷积

回顾池化层

池化层很久之前已经介绍了,这里回顾复习一下。池化层一般是夹在卷积层中间,用于数据压缩和参数压缩,减少过拟合,提高所提取特征的鲁棒性,同时可以提高计算速度。

池化通常有两种——MAX和AVERAGE。最常用的是最大池化,下图是Max池化的一个示例:

CNN的池化层_第1张图片

想象一下,对于一些像素很大的图片,在每个区域进行最大池化操作,那么数字越大,代表越容易被探测到,就可以作为该区域的特定特征。所以最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。

而且,池化层还有一个有意思的点,就是只需要指定超参数,比如步长,核大小,而没有参数需要学习。

池化层的计算机实现

下面我们列举一下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时,等价于平均池化操作。

你可能感兴趣的:(卷积,神经网络,css,卷积神经网络,计算机视觉)