pytorch nn.MaxPool2d 池化层深度讲解及代码举例

首先上理论:
pytorch nn.MaxPool2d 池化层深度讲解及代码举例_第1张图片
池化层是夹在连续的卷积层的中间层,池化层可以非常有效地缩小矩阵的尺寸。从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也有防止过拟合问题的作用。池化层前向传播的过程中也是通过一个类似过滤器的结构完成的,池化层中的计算不是节点的加权和,而是采用了更加简单的最大值或者平均值计算。使用最大值操作的池化层被称之为最大池化层(max pooling),使用平均值操作的池化层称之为平均池化层(average pooling),总的来说,池化层的作用是可以压缩数据和参数的量, 减小过拟合。

如下图展示最大池化层的计算过程:
pytorch nn.MaxPool2d 池化层深度讲解及代码举例_第2张图片
代码举例:

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])

你可能感兴趣的:(pytorch)