深度学习入门-10

基于小土堆学习

池化层学习

池化层(Pooling Layer)是卷积神经网络(CNN)中的一种重要组件,它的主要作用是逐步减小数据的空间尺寸(即高度和宽度),以减少网络中参数的数量和计算量,同时也有助于提取主要特征并减少过拟合的风险。

池化操作通常有以下几种类型:

  • 最大池化(Max Pooling):在输入数据的局部区域中取最大值作为该区域的池化结果。这种方法能够有效地提取出纹理等特征。

  • 平均池化(Average Pooling):计算输入数据局部区域的平均值,并将其作为该区域的池化结果。这种方法对于背景信息的保留较为有利。

  • 随机池化(Stochastic Pooling):按照数值大小赋予概率,再按照概率进行亚采样。这种方法在一定程度上能够避免过拟合。

  • 全局平均池化(Global Average Pooling):对于特征图的每个通道,都计算其所有像素的平均值,通常用于网络的最后几层,以将特征图转换为向量形式进行分类或其他任务。

池化层的主要优点包括:

  • 特征不变性:池化操作使得模型更加关注于特征是否存在,而不是特征的具体位置,这有助于提高模型的鲁棒性。
  • 特征降维:通过减小数据的空间尺寸,池化层能够显著降低后续网络层的计算量。
  • 防止过拟合:池化操作有助于减少模型参数的数量,从而降低过拟合的风险。
    总的来说,池化层在卷积神经网络中扮演着重要的角色,它不仅能够提高计算效率,还有助于提取更加鲁棒和有用的特征。

PyTorch框架中nn模块下的各种池化层(Pooling Layers)

列出了PyTorch框架中nn模块下的各种池化层(Pooling Layers)。这些池化层可以对输入信号进行不同维度的池化操作,包括一维(1D)、二维(2D)和三维(3D)的池化。每种池化层都有其特定的应用场景和优势。

  • nn.MaxPool1d、nn.MaxPool2d、nn.MaxPool3d:
    这些层分别应用一维、二维和三维的最大池化操作。最大池化是在局部区域中取最大值,有助于提取纹理等特征。nn.MaxPool2d最常用的。
  • nn.MaxUnpool1d、nn.MaxUnpool2d、nn.MaxUnpool3d:
    这些层分别计算一维、二维和三维最大池化的部分逆操作。它们通常用于需要恢复原始尺寸或进行特定类型特征提取的场景。
  • nn.AvgPool1d、nn.AvgPool2d、nn.AvgPool3d:
    这些层分别应用一维、二维和三维的平均池化操作。平均池化计算局部区域的平均值,有助于保留背景信息。
  • nn.FractionalMaxPool2d、nn.FractionalMaxPool3d:
    这些层分别应用二维和三维的分数最大池化操作。分数池化是一种更灵活的池化方式,可以在不减少特征图尺寸的情况下进行池化。
  • nn.LPPool1d、nn.LPPool2d、nn.LPPool3d:
    这些层分别应用一维、二维和三维的幂平均池化操作。幂平均池化是一种介于最大池化和平均池化之间的池化方式,通过调整幂参数可以控制池化的行为。
  • nn.AdaptiveMaxPool1d、nn.AdaptiveMaxPool2d、nn.AdaptiveMaxPool3d:
    这些层分别应用一维、二维和三维的自适应最大池化操作。自适应池化可以根据输出尺寸自动调整池化区域的大小。
  • nn.AdaptiveAvgPool1d、nn.AdaptiveAvgPool2d、nn.AdaptiveAvgPool3d:
    这些层分别应用一维、二维和三维的自适应平均池化操作。与自适应最大池化类似,自适应平均池化也可以根据输出尺寸自动调整池化区域的大小。
    总的来说,这些池化层提供了丰富的池化操作选项,可以根据不同的应用场景和需求选择合适的池化层。

MaxPool2d

在这里插入图片描述
torch.nn.MaxPool2d 是 PyTorch 中的一个类,用于对二维输入(例如图像)执行最大池化操作。这个类有多个参数,可以控制池化操作的具体行为。下面是对这些参数的详细解释:

  • kernel_size:池化窗口的大小。可以是一个整数,表示窗口的高度和宽度都是这个值;也可以是一个 (height, width) 元组,分别指定窗口的高度和宽度。

  • stride:池化窗口的步长。如果设置为 None,则默认步长等于窗口的大小。也可以是一个整数或 (height_stride, width_stride) 元组,分别指定窗口在垂直和水平方向上的步长。

  • padding:输入数据的填充大小。如果设置为 0,则不进行填充。也可以是一个整数或 (height_pad, width_pad) 元组,分别指定在输入数据的高度和宽度方向上的填充大小。

  • dilation:池化窗口的扩张大小。如果设置为 1,则表示窗口的相邻元素之间没有空隙。如果设置为大于 1 的整数,则表示窗口的相邻元素之间有扩张的空隙。卷卷积核中间有空洞。
    在这里插入图片描述

  • return_indices:如果设置为 True,则除了返回池化后的输出,还会返回每个最大值的索引。这对于某些特定的应用(如最大池化的逆操作)可能是有用的。

  • ceil_mode:如果设置为 True,则计算输出信号的大小时,会使用向上取整的方式,而不是默认的向下取整。这可能会影响输出的尺寸。
    torch.nn.MaxPool2d 类通常用于卷积神经网络中,以减少数据的空间尺寸,同时保留重要的特征。通过调整这些参数,可以控制池化操作的具体行为,以适应不同的应用场景和需求。
    在这里插入图片描述
    在这里插入图片描述
    最大池化,就是取卷积核覆盖区域的最大值
    第一个像元以2为最终值
    在这里插入图片描述
    kernel_size=3,所下一步
    在这里插入图片描述
    因为多出来了一步,所以ceil_mode=Ture的时候,就要保留,如果是false就不保留,现在为Ture
    在这里插入图片描述
    在这里插入图片描述
    所以ceil_mode=Ture的时候,代码如下所示:

import torch
from torch import nn
from torch.nn import MaxPool2d

input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])
input = torch.reshape(input,(-1,1,5,5))
print("input.shape",input.shape)

class Test(nn.Module):
    def __init__(self):
        super(Test,self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)
    def forward(self,input):
        output = self.maxpool1(input)
        return output
test = Test()
output = test(input)
print(output)

输出结果为

C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\01test\nn_maxpool.py 
input.shape torch.Size([1, 1, 5, 5])
tensor([[[[2, 3],
          [5, 1]]]])

进程已结束,退出代码0

所以ceil_mode=False的时候,代码如下所示:

import torch
from torch import nn
from torch.nn import MaxPool2d

input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])
input = torch.reshape(input,(-1,1,5,5))
print("input.shape",input.shape)

class Test(nn.Module):
    def __init__(self):
        super(Test,self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
    def forward(self,input):
        output = self.maxpool1(input)
        return output
test = Test()
output = test(input)
print(output)

输出结果为:

C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\01test\nn_maxpool.py 
input.shape torch.Size([1, 1, 5, 5])
tensor([[[[2]]]])

进程已结束,退出代码0

为什么要进行最大池化,就是在保留输入特征的时候,同时减少参数,这样可以加快计算速度。例如输入的1080影像,经过池化后可能缩小成720p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值