首先上理论:
池化层是夹在连续的卷积层的中间层,池化层可以非常有效地缩小矩阵的尺寸。从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也有防止过拟合问题的作用。池化层前向传播的过程中也是通过一个类似过滤器的结构完成的,池化层中的计算不是节点的加权和,而是采用了更加简单的最大值或者平均值计算。使用最大值操作的池化层被称之为最大池化层(max pooling),使用平均值操作的池化层称之为平均池化层(average pooling),总的来说,池化层的作用是可以压缩数据和参数的量, 减小过拟合。
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
如果padding不是0,会在输入的每一边添加相应数目0 比如padding=1,则在每一边分别补0 ,其实最后的结果补出来是bias。
公式:out_size=((input_size-kernel_size+2padding)/stride) + 1
参数:
kernel_size(int or tuple) - max pooling的窗口大小,可以为tuple,在nlp中tuple用更多,(n,1)
stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size
padding(int or tuple, optional) - 输入的每一条边补充0的层数
dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数
return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助
ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作
aa = torch.randn(4, 4, 2)
print("aa: ", aa)
bb = nn.MaxPool2d(kernel_size=2, stride=2)
c = bb(aa)
print("c: ", c)
print("c.shape", c.shape)
输出结果:
aa: tensor([[[ 0.2563, 0.1679],
[-0.0911, -0.4592],
[ 0.5738, 2.2330],
[ 1.6843, -0.7041]],
[[-0.6087, -0.6989],
[ 0.9356, 0.6291],
[ 0.8068, -0.9218],
[ 0.7185, 1.6349]],
[[ 1.3434, 0.8802],
[ 1.0233, -0.6212],
[ 1.5200, -0.4483],
[-0.5320, -0.9455]],
[[ 0.8754, 0.7066],
[-0.0026, 0.9473],
[-0.1181, 2.0914],
[ 0.1347, 0.8383]]])
c: tensor([[[0.2563],
[2.2330]],
[[0.9356],
[1.6349]],
[[1.3434],
[1.5200]],
[[0.9473],
[2.0914]]])
c.shape torch.Size([4, 2, 1])