1. 池化层
在卷积网络中, 通常会在卷积层之间增加池化(Pooling) 层, 以降低特征图的参数量, 提升计算速度, 增加感受野, 是一种降采样操作。池化是一种较强的先验, 可以使模型更关注全局特征而非局部出现的位置, 这种降维的过程可以保留一些重要的特征信息, 提升容错能力, 并且还能在一定程度上起到防止过拟合的作用 。
在物体检测中, 常用的池化有最大值池化(Max Pooling) 与平均值池化(Average Pooling) 。 池化层有两个主要的输入参数, 即核尺寸kernel_size与步长stride。 如图3.7所示为一个核尺寸与步长都为2的最大值池化过程, 以左上角为例, 9、 20、 15与26进行最大值池化, 保留26。
下面是PyTorch对于池化层的实现。
1 import torch 2 from torch import nn 3 4 max_pooling = nn.MaxPool2d(2, stride=2) 5 aver_pooling = nn.AvgPool2d(2, stride=2) 6 7 input = torch.randn(1, 1, 4, 4) 8 print(input) 9 >> tensor([[[[ 1.2237, -0.8173, -0.2594, 0.1698], 10 [-0.1023, 0.6973, -0.6429, 0.8561], 11 [-0.3660, 0.1269, 0.2488, 0.0576], 12 [ 0.0859, 0.1622, -0.0725, -0.0237]]]]) 13 14 # 池化主要需要两个参数, 第一个参数代表池化区域大小, 第二个参数表示步长 15 out_max = max_pooling(input) 16 print(out_max) 17 >> tensor([[[[1.2237, 0.8561], 18 [0.1622, 0.2488]]]]) 19 20 # 调用最大值池化与平均值池化, 可以看到size从[1, 1, 4, 4]变为了[1, 1, 2, 2] 21 out_aver = aver_pooling(input) 22 print(out_aver) 23 >> tensor([[[[0.2503, 0.0309], 24 [0.0023, 0.0525]]]])