最近将以前所学的池化层方面知识复习一下
池化层 pooling Layers 是为了压缩数据和参数的量,就是压缩图像缩小图像尺寸,仍保留图像最重要的特征
我对于池化层的学习,是从B站上一个up主学习的 神经网络-最大池化的使用_哔哩哔哩_bilibili
在pytorch框架中,有三种常用的池化层: nn.MaxPool2d、nn.MaxUnpool2d、nn.AvgPool2d
nn.MaxPool2d最大池化层,对二维信号(图像)进行最大值池化,多用于下采样,是为了保留输入图像的的特征,同时把数据量减小,这样训练更快,数据量更小。 例如,有一个kernel_size=3的池化核,用这个池化核去找出图像对应9个位置中的最大值。
nn.MaxUnpool2d 与最大池化层相反的效果,对二维信号(图像)进行最大值池化上采样,多用于上采样,当做上采样的时候把最大值还原到其对应的位置,然后其余的位置补0,这样可以最大限度的还原信息。
nn.AvgPool2d 二维平均池化层 对二维信号(图像)进行平均值池化 输入和输出的特征层数目不变,特征图大小改变。 nn.AvgPool2d(2, 2)和nn.MaxPool2d(2, 2)一样是图像长宽缩小为原来的一半,即图像大小为原来的1/4。 MaxUnpool2d和AvgPool2d的差别:最大池化的亮度会稍微亮一些,毕竟它都是取的最大值,而平均池化是取平均值。
基本参数这三个池化层略有不同,以MaxPool2d为例:
kernel_size在卷积层中是卷积核的大小,在池化层中是池化核的大小,其实就是一个窗口大小;
stride是步长(步幅),与卷积层不同,池化层的步长默认是kernel_size的大小(卷积层默认是1);
dilation是控制池化核元素之间的距离,默认是1,即使dilation>=2,但是采样的数量不会增加,例如kernel_size=3,那就是从9个中取最大值,不管dilation是不是把空间视野扩大了;ceil_mode: 尺寸向上取整,默认为False,一般不变;padding在图像四周填充的数量;return_indices:记录池化像素索引。
最大池化层的计算公式和卷积是一致的, 例如,32@32×32->32@16×16,通道不变,宽高变成16, 假如使用一个2×2的池化核;
16=(32+2p-1*(2-1)-1)/s+1->15s=30+2p
if s=1,p<0,不行;
if s=2,p=0,可以;所以使用 MaxPool2d(kernel_size=2, stride=2, padding=0, ceil_mode=False)就可以使图像缩小一半尺寸;
例如
# 300,300,64 -> 150,150,64 self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=0, ceil_mode=True)
使用一个3×3的池化核,64@300×300->64@150×150,通道不变,宽高缩小一半;
150=(300+2p-1*(3-1)-1)/s+1->149=(297+2p)/s
if s=1,p<0,不行; if s=2,p=0时,(297+0)/2=148.5=149(池化向上取整)
再例如,24->13,假如使用一个3×3的池化核;
13=(24+2p-1*(3-1)-1)/s+1->12=(21+2p)/s
if s=1,p<0,不行;
if s=2,p=1时,(21+2)/2=11.5->12可以;