深度学习中的最大池化究竟有何神奇之处?

摘要:# 一、 torch.nn中Pool layers的介绍 > 官网链接: > > https:pytorch.orgdocsstablenn.html#poolin
一、 torch.nn中Pool layers的介绍 官网链接: https://pytorch.org/docs/stable/nn.html#pooling-layers 1. nn.MaxPool2d介绍 nn.MaxPool2d是在进行图像处理时,Pool layers最常用的函数 官方文档:MaxPool2d — PyTorch 2.0 documentation (1)torch.nn.MaxPool2d类 class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False) (2)参数介绍 kernel_size(int or tuple): 用于设置一个取最大值的窗口,如设置为3,那么会生成一个3×3的窗口 stride(int or tuple): 默认值为kernel_size,步幅,和卷积层中的stride一样 padding(int or tuple): 填充图像,默认填充的值为0 dilation(int): 空洞卷积,即卷积核之间的距离。如卷积核的尺寸为3×3,dilation为1,那么返回一个大小为5×5的卷积核,卷积核每个元素与上下左右的元素之间空一格 return_indices(bool): 一般用的很少,不做介绍 ceil_mode(bool): 默认为False。为True时,输出的shape使用ceil格式(向上取整,即进一);为False时,输出的shape使用floor格式(向下取整)。 二、最大池化操作 1. 最大池化操作举例(理论介绍) 假设有一个5×5的图像和一个3×3的池化核(kenel_size=3),如下图。池化过程就是将池化核与图像进行匹配。下面介绍最大池化的具体操作。 首先用池化核覆盖图像,如下图。然后取到最大值,作为一个输出。 上图为第一次最大池化操作,最大值为2。将2作为一个输出,如下图。 由于本例未对stride进行设置,故stride采取默认值,即stride=kernel_size=3,池化核移动如下图(移动方式与上上文中提到的卷积核移动方式相同,不再赘述)。由于池化核移动已超出范围,要不要取这3×2部分的最大值,取决于call_mode的值,若ceil_mode=True,则取最大值,即输出3;若ceil_mode=False,则不取这部分的值,即这一步不进行池化操作。 假设ceil_mode=True,经过最大池化操作后,输出的结果如下图。 假设ceil_mode=False,经过最大池化操作后,输出的结果如下图。 2. 操作前后的图像大小计算公式 跟卷积操作的计算公式一样。具体如下: 参数说明: N: 图像的batch_size C: 图像的通道数 H: 图像的高 W: 图像的宽 计算过程: Input:\((N,C_{in}​,H_{in}​,W_{in}​)\)or\((C_{in}​,H_{in}​,W_{in}​)\) Output: \((N,C_{out}​,H_{out}​,W_{out}​)\)or\((C_{out}​,H_{out}​,W_{out}​)\) 其中有: \(H_{out}​=⌊\frac{H_{in}​+2×padding[0]−dilation[0]×(kernel\_size[0]−1)−1​}{stride[0]}+1⌋\) \(W_{out}​=⌊\frac{W_{in}​+2×padding[1]−dilation[1]×(kernel\_size[1]−1)−1​}{stride[1]}+1⌋\) 看论文的时候,有些比如像padding这样的参数不知道,就可以用这条公式去进行推导 3. 最大池化操作代码举例 依然选取上面的例子,进行编程。
阅读全文