池化层解析:简单易懂理解 PyTorch 中的核心组件

目录

torch.nn详解

nn.MaxPool1d

nn.MaxPool2d

nn.MaxPool3d

nn.MaxUnpool1d

nn.MaxUnpool2d

nn.MaxUnpool3d

nn.AvgPool1d

nn.AvgPool2d

nn.AvgPool3d

nn.FractionalMaxPool2d

nn.FractionalMaxPool3d

nn.LPPool1d

nn.LPPool2d

nn.AdaptiveMaxPool1d

nn.AdaptiveMaxPool2d

nn.AdaptiveMaxPool3d

nn.AdaptiveAvgPool1d

nn.AdaptiveAvgPool2d

nn.AdaptiveAvgPool3d

总结 


torch.nn详解

nn.MaxPool1d

在 PyTorch 中,nn.MaxPool1d 是一种一维最大池化层,常用于卷积神经网络中对输入张量的空间维度(宽度)进行下采样。该层通过在输入张量上应用一个滑动窗口(也称为池化窗口),并在每个窗口中选择最大值。让我们详细解释一下其参数:

  • kernel_size(Union[int, Tuple[int]]):滑动窗口的大小,必须大于 0。
  • stride(Union[int, Tuple[int]]):滑动窗口的步长,必须大于 0。默认值是 kernel_size
  • padding(Union[int, Tuple[int]]):在两侧添加的隐式负无穷填充,必须大于等于 0 且小于等于 kernel_size / 2
  • dilation(Union[int, Tuple[int]]):滑动窗口内部元素之间的步距,必须大于 0。
  • return_indices(bool):如果为 True,则返回最大值以及其索引。在之后使用 torch.nn.MaxUnpool1d 时很有用。
  • ceil_mode(bool):如果为 True,则使用 ceil 而不是 floor 来计算输出形状。这确保输入张量中的每个元素都被滑动窗口覆盖。

示例:

# 池化大小=3,步长=2
m = nn.MaxPool1d(3, stride=2)
input = torch.randn(20, 16, 50)
output = m(input)

在这个示例中,我们创建了一个池化层 m,其池化大小为 3,步长为 2。然后我们对一个随机生成的输入张量 input 应用这个池化层,并得到了输出张量 output

nn.MaxPool2d

nn.MaxPool2d 是二维最大池化层,广泛用于卷积神经网络来进行空间下采样。它通过在输入张量上应用一个二维滑动窗口,并选择每个窗口中的最大值来工作。以下是它的参数及其解释:

  • kernel_size(Union[int, Tuple[int, int]]):执行最大池化的窗口大小。可以是单个整数(在高度和宽度维度上使用相同的值),或一个包含两个整数的元组(第一个整数用于高度维度,第二个用于宽度维度)。
  • stride(Union[int, Tuple[int, int]]):滑动窗口的步长。默认值是 kernel_size。同样可以是单个整数或两个整数的元组。
  • padding(Union[int, Tuple[int, int]]):在输入的两侧隐式添加的负无穷填充。如果为非零,则输入会在两侧各添加指定数量的填充。
  • dilation(Union[int, Tuple[int, int]]):控制窗口中元素的间距。可以视为窗口中每个点之间的距离。
  • return_indices(bool):如果为 True,则除了输出最大值外,还会返回它们的索引。这在稍后使用 torch.nn.MaxUnpool2d 时非常有用。
  • ceil_mode(bool):如果为 True,则在计算输出形状时使用 ceil 而非 floor。这意味着当滑动窗口开始于左侧填充或输入中时,它们可以超出边界。在右侧填充区域开始的滑动窗口将被忽略。

例子:

# 创建一个池化层,窗口大小=3,步长=2
m = nn.MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1)
input = torch.randn(20, 16, 50, 32)
output = m(input)

在此示例中,我们定义了一个二维最大池化层 m,其窗口大小为 3x3,步长为 2,填充为 1,且不扩展窗口(dilation=1)。然后我们对一个随机生成的输入张量 input 应用这个池化层,并得到了输出张量 output

nn.MaxPool3d

nn.MaxPool3d 是三维最大池化层,用于在三维数据(如3D图像或视频帧)上进行空间下采样。以下是它的参数及其解释:

  1. kernel_size (Union[int, Tuple[int, int, int]]):执行最大池化的立方体(或“窗口”)的大小。可以是单个整数(在深度、高度和宽度维度上使用相同的值),或一个包含三个整数的元组(第一个整数用于深度维度,第二个用于高度维度,第三个用于宽度维度)。

  2. stride (Union[int, Tuple[int, int, int]]):滑动窗口的步长。默认值是 kernel_size。同样可以是单个整数或三个整数的元组。

  3. padding (Union[int, Tuple[int, int, int]]):在输入的所有三侧隐式添加的负无穷填充。填充数量指定了在每个维度上要添加的填充点数。

  4. dilation (Union[int, Tuple[int, int, int]]):控制窗口中元素的间距。这个参数决定了窗口内各点之间的距离。

  5. return_indices (bool):如果为 True,则除了输出最大值外,还会返回它们的索引。这在稍后使用 torch.nn.MaxUnpool3d 时非常有用。

  6. ceil_mode (bool):如果为 True,则在计算输出形状时使用 ceil 而非 floor。这意味着允许滑动窗口超出输入边界,只要它们开始于左侧填充或输入内部。在右侧填充区域开始的滑动窗口将被忽略。

使用 nn.MaxPool3d 的例子:

# 创建一个池化层,窗口大小=3x3x3,步长=2
m = nn.MaxPool3d(kernel_size=3, stride=2, padding=1, dilation=1)
input = torch.randn(20, 16, 50, 44, 32)  # 示例输入
output = m(input)

在这个例子中,定义了一个三维最大池化层 m,其窗口大小为 3x3x3,步长为 2,填充为 1,且不扩展窗口(dilation=1)。然后对一个随机生成的三维输入张量 input 应用这个池化层,得到输出张量 output

nn.MaxUnpool1d

torch.nn.MaxUnpool1d 是 PyTorch 中的一个类,它实现了 MaxPool1d 的部分逆运算。MaxPool1d 是不完全可逆的,因为在池化过程中非最大值丢失了。MaxUnpool1d 通过接受 MaxPool1d 的输出及最大值的索引,并将所有非最大值设为零,来完成这一部分逆运算。

注意点

  1. 非确定性操作:当输入索引存在重复值时,该操作可能表现出非确定性。这可能会影响模型的重现性。

  2. 模糊的反向映射:由于 MaxPool1d 可以将多个不同大小的输入映射到相同大小的输出,因此反向映射过程可能会有歧义。为了解决这个问题,可以在前向传播调用时提供所需的输出大小作为额外的参数 output_size

参数

  • kernel_size (int 或 tuple):最大池化窗口的大小。
  • stride (int 或 tuple):最大池化窗口的步长。默认值为 kernel_size
  • padding (int 或 tuple):输入中添加的填充量。

输入

  • input:要反转的输入张量。
  • indices:由 MaxPool1d 提供的最大值索引。
  • output_size (可选):目标输出大小。

示例

# 创建最大池化和对应的反池化层
pool = nn.MaxPool1d(2, stride=2, return_indices=True)
unpool = nn.MaxUnpool1d(2, stride=2)# 输入张量
input = torch.tensor([[[1., 2, 3, 4, 5, 6, 7, 8]]])# 应用池化和反池化
output, indices = pool(input)
unpooled_output = unpool(output, indices)
# 输出: tensor([[[ 0.,  2.,  0.,  4.,  0.,  6.,  0., 8.]]])# 使用 output_size 的示例
input = torch.tensor([[[1., 2, 3, 4, 5, 6, 7, 8, 9]]])
output, indices = pool(input)
unpooled_output = unpool(output, indices, output_size=input.size())
# 输出: tensor([[[ 0.,  2.,  0.,  4.,  0.,  6.,  0., 8.,  0.]]])

        在这些示例中,首先进行最大池化操作,然后使用 MaxUnpool1d 进行部分逆操作。在第二个示例中,通过指定 output_size 参数,确保反池化输出的尺寸与原始输入一致。

nn.MaxUnpool2d

torch.nn.MaxUnpool2d 是 PyTorch 中的一个类,用于实现 MaxPool2d 的部分逆操作。由于 MaxPool2d 在池化过程中丢失了非最大值,因此它不是完全可逆的。MaxUnpool2d 的作用是接受 MaxPool2d 的输出(包括最大值的索引)并计算一个部分逆操作,在这个操作中,所有非最大值被设置为零。

注意事项

  1. 非确定性操作:当输入索引有重复值时,此操作可能表现出非确定性。更多信息见 PyTorch 文档和可重现性指南。

  2. 模糊的反向映射MaxPool2d 可以将多个不同大小的输入映射到相同大小的输出,因此反向映射过程可能会有歧义。为了解决这个问题,可以在前向传播调用时提供所需的输出大小作为额外的参数 output_size

参数

  • kernel_size (int 或 tuple):最大池化窗口的大小。
  • stride (int 或 tuple):最大池化窗口的步长。默认值为 kernel_size
  • padding (int 或 tuple):输入中添加的填充量。

输入

  • input:要反转的输入张量。
  • indices:由 MaxPool2d 提供的最大值索引。
  • output_size (可选):目标输出大小。

示例

# 创建最大池化和对应的反池化层
pool = nn.MaxPool2d(2, stride=2, return_indices=True)
unpool = nn.MaxUnpool2d(2, stride=2)# 输入张量
input = torch.tensor([[[[ 1.,  2.,  3.,  4.],[ 5.,  6.,  7.,  8.],[ 9., 10., 11., 12.],[13., 14., 15., 16.]]]])
output, indices = pool(input)
unpooled_output = unpool(output, indices)
# 输出: tensor([[[[  0.,   0.,   0.,   0.],
#                [  0.,   6.,   0.,   8.],
#                [  0.,   0.,   0.,   0.],
#                [  0.,  14.,   0.,  16.]]]])# 使用 output_size 的示例
input = torch.tensor([[[[ 1.,  2.,  3., 4., 5.],[ 6.,  7.,  8., 9., 10.],[11., 12., 13., 14., 15.],[16., 17., 18., 19., 20.]]]])
output, indices = pool(input)
unpooled_output = unpool(output, indices, output_size=input.size())
# 输出: tensor([[[[ 0.,  0.,  0.,  0.,  0.],
#                [ 0.,  7.,  0.,  9.,  0.],
#                [ 0.,  0.,  0.,  0.,  0.],
#                [ 0., 17.,  0., 19.,  0.]]]])

 在这些示例中,MaxUnpool2d 用于对 MaxPool2d 的结果进行部分逆操作。第二个示例中,通过指定 output_size 参数,确保反池化输出的尺寸与原始输入一致。

nn.MaxUnpool3d

torch.nn.MaxUnpool3d 是 PyTorch 中的一个类,用于实现 MaxPool3d 的部分逆操作。由于 MaxPool3d 在池化过程中丢失了非最大值,因此它不是完全可逆的。MaxUnpool3d 的作用是接受 MaxPool3d 的输出(包括最大值的索引)并计算一个部分逆操作,在这个操作中,所有非最大值被设置为零。

注意事项

  1. 非确定性操作:当输入索引有重复值时,此操作可能表现出非确定性。更多信息见 PyTorch 文档和可重现性指南。

  2. 模糊的反向映射MaxPool3d 可以将多个不同大小的输入映射到相同大小的输出,因此反向映射过程可能会有歧义。为了解决这个问题,可以在前向传播调用时提供所需的输出大小作为额外的参数 output_size

参数

  • kernel_size (int 或 tuple):最大池化窗口的大小。
  • stride (int 或 tuple):最大池化窗口的步长。默认值为 kernel_size
  • padding (int 或 tuple):输入中添加的填充量。

输入

  • input:要反转的输入张量。
  • indices:由 MaxPool3d 提供的最大值索引。
  • output_size (可选):目标输出大小。

示例

# 创建最大池化和对应的反池化层
pool = nn.MaxPool3d(3, stride=2, return_indices=True)
unpool = nn.MaxUnpool3d(3, stride=2)# 输入张量
input = torch.randn(20, 16, 51, 33, 15)
output, indices = pool(input)
unpooled_output = unpool(output, indices)
# 检查反池化后的尺寸
print(unpooled_output.size())  # 输出: torch.Size([20, 16, 51, 33, 15])

 在这个示例中,MaxUnpool3d 用于对 MaxPool3d 的结果进行部分逆操作。通过指定 output_size 参数,可以确保反池化输出的尺寸与原始输入一致。

nn.AvgPool1d

torch.nn.AvgPool1d 是 PyTorch 中的一个类,用于在一维数据上执行平均池化操作。它通过将输入数据划分为大小固定的窗口,并在每个窗口内计算平均值来降低数据的维度,从而实现池化。

重要特性

  1. 隐式零填充:如果 padding 参数非零,则在输入的两侧隐式地添加零填充。填充的数量由 padding 参数的值决定。

  2. 输出形状的计算

    • ceil_mode=True 时,使用向上取整而不是向下取整来计算输出的形状。这确保了所有输入元素都被窗口覆盖。
    • 若窗口开始于左侧填充区域或输入区域内,允许窗口超出边界。从右侧填充区域开始的窗口将被忽略。

参数

  • kernel_size (int 或 tuple):池化窗口的大小。
  • stride (int 或 tuple):池化窗口的步长。默认值为 kernel_size
  • padding (int 或 tuple):在两侧添加的隐式零填充量。
  • ceil_mode (bool):如果为 True,使用向上取整计算输出形状。
  • count_include_pad (bool):如果为 True,在计算平均值时包括零填充。

示例

# 创建一维平均池化层,窗口大小为3,步长为2
m = nn.AvgPool1d(3, stride=2)
# 输入张量
input = torch.tensor([[[1., 2, 3, 4, 5, 6, 7]]])
# 应用平均池化
output = m(input)
print(output)  # 输出: tensor([[[2., 4., 6.]]])

在这个示例中,AvgPool1d 对输入数据进行了平均池化。每个窗口覆盖3个元素,步长为2,因此第一个窗口计算了 [1., 2, 3] 的平均值,第二个窗口计算了 [3, 4, 5] 的平均值,以此类推。由于采用的是平均池化,每个窗口的输出是窗口内元素的平均值。

nn.AvgPool2d

torch.nn.AvgPool2d 是 PyTorch 中用于二维数据的平均池化层。这个类通过对输入数据应用大小固定的滑动窗口,并计算每个窗口内元素的平均值来降低数据的维度,这种操作通常用于卷积神经网络中降低特征图的空间维度。

主要特性

  1. 隐式零填充:如果 padding 参数非零,则在输入的两侧隐式地添加零填充。填充的数量由 padding 参数的值决定。

  2. 输出形状的计算

    • ceil_mode=True 时,使用向上取整而不是向下取整来计算输出的形状。这确保了所有输入元素都被窗口覆盖。
    • 若窗口开始于左侧填充区域或输入区域内,允许窗口超出边界。从右侧填充区域开始的窗口将被忽略。

参数

  • kernel_size (int 或 tuple):池化窗口的大小。
  • stride (int 或 tuple):池化窗口的步长。默认值为 kernel_size
  • padding (int 或 tuple):在两侧添加的隐式零填充量。
  • ceil_mode (bool):如果为 True,使用向上取整计算输出形状。
  • count_include_pad (bool):如果为 True,在计算平均值时包括零填充。
  • divisor_override (Optional[int]):如果指定,将用作除数,否则使用池化区域的大小。

示例

# 创建二维平均池化层,窗口大小为3x3,步长为2
m = nn.AvgPool2d(3, stride=2)
# 创建二维平均池化层,非方形窗口
m = nn.AvgPool2d((3, 2), stride=(2, 1))
# 输入张量
input = torch.randn(20, 16, 50, 32)
# 应用平均池化
output = m(input)

 在这个示例中,AvgPool2d 对输入数据进行了平均池化。第一个例子中的池化层使用3x3的方形窗口和步长为2,第二个例子使用3x2的非方形窗口和不同的步长。每个窗口覆盖相应大小的元素,并计算这些元素的平均值。这种类型的池化操作常用于减少特征图的空间维度,同时保留重要的特征信息。

nn.AvgPool3d

torch.nn.AvgPool3d 是 PyTorch 中用于三维数据的平均池化层,主要应用于三维卷积神经网络。这个类通过在输入数据上应用一个固定大小的三维滑动窗口,并计算每个窗口内元素的平均值,以此来降低数据的维度。

主要特性

  1. 隐式零填充:如果 padding 参数非零,输入数据将在所有三个维度上隐式地添加零填充。

  2. 输出形状的计算

    • ceil_mode=True 时,使用向上取整而不是向下取整来计算输出的形状,确保每个输入元素都被覆盖。
    • 若窗口开始于左侧填充区或输入区内,允许窗口超出边界。从右侧填充区开始的窗口将被忽略。

参数

  • kernel_size (int 或 tuple):池化窗口的大小。
  • stride (int 或 tuple):池化窗口的步长。默认值为 kernel_size
  • padding (int 或 tuple):在所有三个维度上添加的隐式零填充。
  • ceil_mode (bool):如果为 True,计算输出形状时使用向上取整。
  • count_include_pad (bool):如果为 True,计算平均值时包括零填充。
  • divisor_override (Optional[int]):如果指定,它将用作除数,否则将使用 kernel_size

示例

# 创建三维平均池化层,窗口大小为3x3x3,步长为2
m = nn.AvgPool3d(3, stride=2)
# 输入张量
input = torch.randn(20, 16, 51, 33, 15)
# 应用平均池化
output = m(input)

在这个示例中,AvgPool3d 对输入数据进行了三维平均池化。池化层使用3x3x3的立方体窗口和步长为2。每个窗口覆盖相应大小的元素,并计算这些元素的平均值。这种类型的池化操作用于减少三维特征图的空间维度,同时保留关键的特征信息,常见于三维图像处理或视频处理的深度学习应用中。

nn.FractionalMaxPool2d

torch.nn.FractionalMaxPool2d 是 PyTorch 中用于实现二维分数最大池化的类。分数最大池化(Fractional MaxPooling)是一种池化操作,它与传统的最大池化略有不同。在传统的最大池化中,池化窗口的大小和步长是固定的。相比之下,分数最大池化允许使用随机或非整数的步长,从而可以获得不同大小的输出特征图。

主要特性

  1. 随机步长:通过目标输出大小确定的随机步长对输入数据进行池化。

  2. 灵活的输出尺寸:可以通过指定输出尺寸或输出比例来控制输出特征图的大小。

参数

  • kernel_size (int 或 tuple):池化窗口的大小。可以是单个数字 k(表示 k x k 的方形窗口)或一个元组 (kh, kw)。
  • output_size (int 或 tuple):目标输出尺寸,形式为 oH x oW。可以是元组 (oH, oW) 或单个数字 oH(表示方形图像 oH x oH)。
  • output_ratio (float 或 tuple):如果希望输出尺寸是输入尺寸的比例,则可以使用此选项。必须是 (0, 1) 范围内的数字或元组。
  • return_indices (bool):如果为 True,则返回最大值的索引和输出。这对于后续使用 nn.MaxUnpool2d() 很有用。默认为 False。

示例

# 方形窗口大小为3,目标输出尺寸为 13x12
m = nn.FractionalMaxPool2d(3, output_size=(13, 12))
# 输入张量
input = torch.randn(20, 16, 50, 32)
# 应用分数最大池化
output = m(input)# 方形窗口大小为3,目标输出尺寸为输入尺寸的一半
m = nn.FractionalMaxPool2d(3, output_ratio=(0.5, 0.5))
# 输入张量
input = torch.randn(20, 16, 50, 32)
# 应用分数最大池化
output = m(input)

 在这些示例中,FractionalMaxPool2d 根据指定的输出尺寸或输出比例,使用随机步长对输入张量进行二维最大池化。这种类型的池化操作用于在保留重要特征的同时减少特征图的尺寸,特别适用于需要更细粒度控制输出尺寸的情况。

nn.FractionalMaxPool3d

torch.nn.FractionalMaxPool3d 是 PyTorch 中用于实现三维分数最大池化(Fractional MaxPooling)的类。与二维版本类似,它允许使用随机或非整数的步长来进行池化,从而可以获得不同大小的输出特征图。这种池化操作对于提取三维数据(如体积图像或视频序列)中的特征特别有用。

主要特性

  1. 随机步长:通过目标输出大小确定的随机步长对输入数据进行池化。
  2. 灵活的输出尺寸:可以通过指定输出尺寸或输出比例来控制输出特征图的大小。

参数

  • kernel_size (int 或 tuple):池化窗口的大小。可以是单个数字 k(表示 k x k x k 的立方窗口)或一个元组 (kt, kh, kw)。
  • output_size (int 或 tuple):目标输出尺寸,形式为 oT x oH x oW。可以是元组 (oT, oH, oW) 或单个数字 oH(表示立方图像 oH x oH x oH)。
  • output_ratio (float 或 tuple):如果希望输出尺寸是输入尺寸的比例,则可以使用此选项。必须是 (0, 1) 范围内的数字或元组。
  • return_indices (bool):如果为 True,则返回最大值的索引和输出。这对于后续使用 nn.MaxUnpool3d() 很有用。默认为 False。

示例

# 立方窗口大小为3,目标输出尺寸为 13x12x11
m = nn.FractionalMaxPool3d(3, output_size=(13, 12, 11))
# 输入张量
input = torch.randn(20, 16, 50, 32, 16)
# 应用分数最大池化
output = m(input)# 立方窗口大小为3,目标输出尺寸为输入尺寸的一半
m = nn.FractionalMaxPool3d(3, output_ratio=(0.5, 0.5, 0.5))
# 输入张量
input = torch.randn(20, 16, 50, 32, 16)
# 应用分数最大池化
output = m(input)

 在这些示例中,FractionalMaxPool3d 根据指定的输出尺寸或输出比例,使用随机步长对输入张量进行三维最大池化。这种类型的池化操作用于在保留重要特征的同时减少特征图的尺寸,特别适用于处理三维数据或视频内容。

nn.LPPool1d

 torch.nn.LPPool1d 是 PyTorch 中用于实现一维 Lp 池化(Lp pooling)的类。这种池化操作是最大池化(Max Pooling)和平均池化(Average Pooling)的泛化形式,它使用 Lp 范数来池化输入数据。

主要特性

  1. Lp 范数:通过 Lp 范数计算池化区域内的平均值,其中 p 由 norm_type 参数指定。
  2. 灵活的窗口和步长:可以指定池化窗口的大小(kernel_size)和步长(stride)。

参数

  • norm_type (float):指定 Lp 范数的 p 值。例如,p=2 时为 L2 范数(平方和的平方根)。
  • kernel_size (int 或 tuple):单个整数,指定池化窗口的大小。
  • stride (int 或 tuple):单个整数,指定池化窗口的步长。默认值为 kernel_size
  • ceil_mode (bool):如果为 True,则使用 ceil 而不是 floor 来计算输出形状。

注意

  • 如果 p 次幂之和为零,则此函数的梯度未定义。在这种情况下,实现将梯度设置为零。

示例

# 二次方平均池化,窗口长度为 3,步长为 2
m = nn.LPPool1d(2, 3, stride=2)
# 输入张量
input = torch.randn(20, 16, 50)
# 应用 Lp 池化
output = m(input)

 在此示例中,LPPool1d 使用 L2 范数(即平方和的平方根)对输入张量的每个一维子区域进行池化。它可以捕获区域内的整体能量或强度,而不是像最大池化那样只关注最大值。这种类型的池化操作用于在保留关键信息的同时减少特征的尺寸,特别适用于处理一维信号数据(如音频波形)。

nn.LPPool2d

torch.nn.LPPool2d 是 PyTorch 中用于实现二维 Lp 池化(Lp pooling)的类。这种池化操作是最大池化(Max Pooling)和平均池化(Average Pooling)的泛化形式,它使用 Lp 范数来池化输入数据。

主要特性

  1. Lp 范数:通过 Lp 范数计算池化区域内的平均值,其中 p 由 norm_type 参数指定。
  2. 灵活的窗口和步长:可以指定池化窗口的大小(kernel_size)和步长(stride)。

参数

  • norm_type (float):指定 Lp 范数的 p 值。
  • kernel_size (int 或 tuple):指定池化窗口的大小。
  • stride (int 或 tuple):指定池化窗口的步长。默认值为 kernel_size
  • ceil_mode (bool):如果为 True,则使用 ceil 而不是 floor 来计算输出形状。

注意

  • 如果 p 次幂之和为零,则此函数的梯度未定义。在这种情况下,实现将梯度设置为零。

示例

# 二次方平均池化,正方形窗口大小为 3,步长为 2
m = nn.LPPool2d(2, 3, stride=2)
# 非正方形窗口的 1.2 次方平均池化
m = nn.LPPool2d(1.2, (3, 2), stride=(2, 1))
# 输入张量
input = torch.randn(20, 16, 50, 32)
# 应用 Lp 池化
output = m(input)

 在此示例中,LPPool2d 使用 L2 范数(平方和的平方根)对输入张量的每个二维子区域进行池化。这可以捕获区域内的整体能量或强度,而不是像最大池化那样只关注最大值。这种类型的池化操作用于在保留关键信息的同时减少特征的尺寸,特别适用于处理图像和二维信号数据。

nn.AdaptiveMaxPool1d

torch.nn.AdaptiveMaxPool1d 是 PyTorch 中用于实现一维自适应最大池化(Adaptive Max Pooling)的类。这种池化操作允许模型自动适应不同大小的输入数据,确保输出张量具有特定的大小。

主要特性

  1. 自适应输出大小:无论输入数据的尺寸如何,都能得到固定大小的输出。
  2. 灵活适应输入:对于不同长度的输入序列,可以灵活调整池化窗口的大小。

参数

  • output_size (int 或 tuple):目标输出大小 L_{out}。这是池化后的长度。
  • return_indices (bool):如果为 True,则返回最大值的索引以及输出。这对于稍后使用 nn.MaxUnpool1d 进行反池化非常有用。默认为 False。

示例

# 目标输出大小为 5 的自适应最大池化
m = nn.AdaptiveMaxPool1d(5)
# 输入张量,尺寸为 (批次大小, 通道数, 长度)
input = torch.randn(1, 64, 8)
# 应用自适应最大池化
output = m(input)

在此示例中,无论输入张量的长度是多少(在这个例子中是 8),AdaptiveMaxPool1d 都会调整其内部池化窗口的大小,以确保输出张量的长度始终为 5。这种自适应池化方法在处理具有不同长度的时间序列或信号时非常有用,例如在处理不同长度的音频记录或其他一维信号时。通过自适应池化,可以确保网络的后续层总是接收到固定大小的输入,从而简化了模型的设计和优化。

nn.AdaptiveMaxPool2d

torch.nn.AdaptiveMaxPool2d 是 PyTorch 中用于实现二维自适应最大池化(Adaptive Max Pooling)的类。这种池化操作允许模型自动适应不同尺寸的输入数据,确保输出张量具有特定的尺寸。

主要特性

  1. 自适应输出尺寸:不论输入数据的尺寸如何,输出都具有固定的尺寸 H_{out}\ast W_{out}​。
  2. 灵活性:适用于多种场景,特别是当输入图片尺寸不固定时

参数

  • output_size (int, tuple, None):目标输出尺寸 H_{out}\ast W_{out}。可以是一个元组 (H_{out},W_{out}) 或单个整数 H_{out} (对于正方形图像)。​ H_{out}W_{out}可以是整数或 None,None 表示输出尺寸与输入相同。
  • return_indices (bool):如果为 True,将返回最大值的索引及输出。这在使用 nn.MaxUnpool2d 进行反池化时非常有用。默认为 False。

示例

# 目标输出尺寸为 5x7 的自适应最大池化
m = nn.AdaptiveMaxPool2d((5, 7))
input = torch.randn(1, 64, 8, 9)
output = m(input)# 目标输出尺寸为 7x7(正方形)的自适应最大池化
m = nn.AdaptiveMaxPool2d(7)
input = torch.randn(1, 64, 10, 9)
output = m(input)# 目标输出尺寸为 10x7 的自适应最大池化
m = nn.AdaptiveMaxPool2d((None, 7))
input = torch.randn(1, 64, 10, 9)
output = m(input)

 在这些示例中,无论输入张量的高度和宽度是多少,AdaptiveMaxPool2d 都会调整其内部池化窗口的大小,以确保输出张量具有指定的尺寸。这种自适应池化方法在处理具有不同尺寸的图像时非常有用,例如在处理来自不同来源的图像集时。通过自适应池化,可以确保网络的后续层总是接收到固定尺寸的输入,从而简化了模型的设计和优化。

nn.AdaptiveMaxPool3d

torch.nn.AdaptiveMaxPool3d 是 PyTorch 中的一个类,用于实现三维自适应最大池化(Adaptive Max Pooling)。这种池化操作允许模型自动适应不同尺寸的输入数据,确保输出张量具有特定的尺寸。

主要特性

  1. 自适应输出尺寸:不论输入数据的尺寸如何,输出都具有固定的尺寸D_{out}*H_{out}*W_{out}
  2. 适用于3D数据:适用于处理三维数据(如体积图像或视频序列),使输出尺寸保持一致。

参数

  • output_size (int, tuple, None):目标输出尺寸 D_{out}*H_{out}*W_{out}。可以是一个元组 (D_{out}*H_{out}*W_{out})或单个整数 D_{out}(对于立方体数据)。D_{out}, H_{out}, W_{out}可以是整数或 None,None 表示输出尺寸与输入相同。
  • return_indices (bool):如果为 True,将返回最大值的索引及输出。这在使用 nn.MaxUnpool3d 进行反池化时非常有用。默认为 False。

 示例

# 目标输出尺寸为 5x7x9 的自适应最大池化
m = nn.AdaptiveMaxPool3d((5, 7, 9))
input = torch.randn(1, 64, 8, 9, 10)
output = m(input)# 目标输出尺寸为 7x7x7(立方体)的自适应最大池化
m = nn.AdaptiveMaxPool3d(7)
input = torch.randn(1, 64, 10, 9, 8)
output = m(input)# 目标输出尺寸为 7x9x8 的自适应最大池化
m = nn.AdaptiveMaxPool3d((7, None, None))
input = torch.randn(1, 64, 10, 9, 8)
output = m(input)

 在这些示例中,无论输入张量的深度、高度和宽度是多少,AdaptiveMaxPool3d 都会调整其内部池化窗口的大小,以确保输出张量具有指定的尺寸。这种自适应池化方法在处理具有不同尺寸的三维数据时非常有用,例如在医学成像或视频处理领域。通过自适应池化,可以确保网络的后续层总是接收到固定尺寸的输入,从而简化了模型的设计和优化。

nn.AdaptiveAvgPool1d

torch.nn.AdaptiveAvgPool1d 是 PyTorch 中的一个类,它实现了一维自适应平均池化(Adaptive Average Pooling)。这种池化方式允许模型适应不同长度的输入序列,同时确保输出序列具有固定的长度。

主要特性

  1. 自适应输出长度:无论输入序列的长度如何,输出序列的长度 L_{out}都是固定的。
  2. 适用于1D数据:特别适合处理一维数据,如时间序列或一维信号。

参数

  • output_size (int 或 tuple):目标输出长度 L_{out}​。可以是一个整数,指定输出序列的固定长度。

示例: 

# 目标输出长度为 5 的自适应平均池化
m = nn.AdaptiveAvgPool1d(5)
input = torch.randn(1, 64, 8)  # 输入序列长度为 8
output = m(input)  # 输出序列长度为 5

 在这个示例中,无论输入序列的长度是多少,AdaptiveAvgPool1d 都会调整其内部池化窗口的大小,以确保输出序列的长度为指定的 5。这种自适应池化方法在处理长度不一的一维数据时非常有用,例如在音频处理或时间序列分析中。通过自适应池化,可以确保网络的后续层总是接收到固定长度的输入,从而简化了模型的设计和优化过程。

nn.AdaptiveAvgPool2d

torch.nn.AdaptiveAvgPool2d 是 PyTorch 中的一个类,用于实现二维自适应平均池化(Adaptive Average Pooling)。这种池化方式使得模型能够自适应不同尺寸的输入图像,同时确保输出图像具有指定的尺寸。

主要特性

  1. 自适应输出尺寸:无论输入图像的尺寸如何,输出图像的尺寸都是固定的,即H_{out}*W_{out}
  2. 适用于2D数据:特别适合处理二维数据,如图像。

参数

  • output_size (int, None 或 tuple):目标输出尺寸 H_{out}*W_{out}。可以是一个元组 (H, W) 或一个整数 H(对于正方形图像)。H 和 W 可以是整数或 None,None 表示尺寸将与输入相同。

输入和输出形状

  • 输入:形状为 (N, C, H_in, W_in) 或 (C, H_in, W_in),其中 N 是批次大小,C 是通道数,H_in 和 W_in 是输入图像的高度和宽度。
  • 输出:形状为 (N, C, S_0, S_1) 或 (C, S_0, S_1),其中 S_0 和 S_1 是输出尺寸,由 output_size 指定。

示例

# 目标输出尺寸为 5x7 的自适应平均池化
m = nn.AdaptiveAvgPool2d((5, 7))
input = torch.randn(1, 64, 8, 9)
output = m(input)# 目标输出尺寸为 7x7(正方形)的自适应平均池化
m = nn.AdaptiveAvgPool2d(7)
input = torch.randn(1, 64, 10, 9)
output = m(input)# 目标输出尺寸为 10x7 的自适应平均池化
m = nn.AdaptiveAvgPool2d((None, 7))
input = torch.randn(1, 64, 10, 9)
output = m(input)

 在这些示例中,AdaptiveAvgPool2d 通过调整内部池化窗口的大小,确保无论输入图像的尺寸如何,输出图像始终具有指定的尺寸。这在处理不同尺寸的图像时非常有用,例如在图像分类或对象检测任务中。通过自适应池化,可以确保网络的后续层总是接收到固定尺寸的输入,从而简化了模型的设计和优化过程。

nn.AdaptiveAvgPool3d

torch.nn.AdaptiveAvgPool3d 是 PyTorch 中的一个类,用于实现三维自适应平均池化(Adaptive Average Pooling)。这种池化方式适用于三维数据,例如在医学成像或视频处理中常见的三维体积数据。

主要特性

  1. 自适应输出尺寸:无论输入体积的尺寸如何,输出体积的尺寸都是固定的,即D_{out}*H_{out}*W_{out}
  2. 适用于3D数据:特别适合处理三维数据,如体积数据或视频序列。

参数

  • output_size (int, None 或 tuple):目标输出尺寸 D_{out}*H_{out}*W_{out}​。可以是一个元组 (D, H, W) 或一个整数 D(对于立方体体积 D x D x D)。D、H 和 W 可以是整数或 None,None 表示尺寸将与输入相同。

输入和输出形状

  • 输入:形状为 (N, C, D_in, H_in, W_in) 或 (C, D_in, H_in, W_in),其中 N 是批次大小,C 是通道数,D_in、H_in 和 W_in 是输入体积的深度、高度和宽度。
  • 输出:形状为 (N, C, S_0, S_1, S_2) 或 (C, S_0, S_1, S_2),其中 S_0、S_1、S_2 是输出尺寸,由 output_size 指定。

示例

# 目标输出尺寸为 5x7x9 的自适应平均池化
m = nn.AdaptiveAvgPool3d((5, 7, 9))
input = torch.randn(1, 64, 8, 9, 10)
output = m(input)# 目标输出尺寸为 7x7x7(立方体)的自适应平均池化
m = nn.AdaptiveAvgPool3d(7)
input = torch.randn(1, 64, 10, 9, 8)
output = m(input)# 目标输出尺寸为 7x9x8 的自适应平均池化
m = nn.AdaptiveAvgPool3d((7, None, None))
input = torch.randn(1, 64, 10, 9, 8)
output = m(input)

在这些示例中,AdaptiveAvgPool3d 通过调整内部池化窗口的大小,确保无论输入体积的尺寸如何,输出体积始终具有指定的尺寸。这在处理不同尺寸的三维数据时非常有用,例如在体积图像分类或三维对象检测任务中。通过自适应池化,可以确保网络的后续层总是接收到固定尺寸的输入,从而简化了模型的设计和优化过程。

总结 

在这篇博客中,我们深入探讨了 PyTorch 中的多种池化层(Pooling layers),它们在深度学习和神经网络中起着至关重要的作用。从基本的最大池化(Max Pooling)到平均池化(Average Pooling),再到更高级的自适应池化(Adaptive Pooling)和分数池化(Fractional Pooling),我们详细解释了每种池化操作的特点、参数和应用场景。这些池化层不仅减少了模型的参数数量,还帮助提高了计算效率,并能够在一定程度上防止过拟合。无论是一维数据(如音频信号),二维数据(如图像),还是三维数据(如体积图像或视频序列),池化层都能够在保持数据的关键特征的同时,有效地降低数据的维度。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git打tag以及拉取tag

场景:某次git代码发布后定版记录,将发版所在的commit时候代码打上tag记录,方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …

练习-指针笔试题

目录 前言一、一维整型数组1.1 题目一1.2 题目二 二、二维整型数组2.1 题目一2.2 题目二2.3 题目三 三、结构体3.1 题目一(32位机器运行) 四、字符数组4.1 题目一4.2 题目二 总结 前言 本篇文章记录关于C语言指针笔试题的介绍。 一、一维整型数组 1.1 …

【GoLang入门教程】Go语言几种标准库介绍(五)

如何解决大模型的「幻觉」问题? 文章目录 如何解决大模型的「幻觉」问题?前言几种库image库 (常见图形格式的访问及生成)关键概念和类型:示例 IO库示例 math库(数学库)常用的函数和常量:示例 总结专栏集锦写在最后 前言 上一篇&a…

Spring Redis Client使用Hessian序列化HINCRBY命令的Bug

前言: 公司自己封装Redis Client架包,使用Hessian协议对Redis中Value值进行序列化。在使用Hash结构的HINCRBY命令,处理序列化异常的问题。下面,我将详细说明一下。 正文: 公司封装Redis Client架包,其实就…

开源大数据集群部署(三)集群mysql数据库部署

开源大数据集群部署(一)集群实施规划 开源大数据集群部署(二)集群基础环境实施准备 作者:櫰木 本文将介绍mysql部署,其中在hd1.dtstack.com主机root权限下安装配置 1 解压文件 解压名为mysql-8.0.31-lin…

Spring MVC(day1)

什么是MVC MVC是一种设计模式,将软件按照模型、视图、控制器来划分: M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean:专门存储业务数据…

我在工作一年时怎么都看不懂的编程写法。今天手把手教给你

作为一名程序员,你一定遇到或亲自写过这样的代码。有人将它形象的形容为shi山,或者被戏称为“面向保就业编程”。 以下面这个代码为例,其中的问题也显而易见,当越来越多的条件判断时,代码会变得非常臃肿,难…

使用Pipeline和ColumnTransformer提升机器学习代码质量

机器学习项目中最冗长的步骤通常是数据清洗和预处理,Scikit-learn库中的Pipeline和 and ColumnTransformer通过一次封装替代逐步运行transformation步骤,从而减少冗余代码量。 1. Pipeline vs. ColumnTransformer 训练模型前,需要将数据集分…

目标检测数据集大全「包含VOC+COCO+YOLO三种格式+划分脚本+训练脚本」(持续原地更新)

一、作者介绍:五年算法开发经验、AI 算法经理、阿里云开发社区专家博主、稀土掘金人工智能内容评审委员会成员。擅长:检测、分割、理解、AIGC 等算法训练与部署。 二、数据集介绍: 质量高:高质量图片、高质量标注数据,…

9.建造者模式

文章目录 一、介绍二、代码三、实际使用总结 一、介绍 建造者模式旨在将一个复杂对象的构建过程和其表示分离,以便同样的构建过程可以创建不同的表示。这种模式适用于构建对象的算法(构建过程)应该独立于对象的组成部分以及它们的装配方式的…

SpringMVC SpringMVC 的入门

2.1.环境搭建 2.1.1.创建工程 2.1.2.添加web支持 右键项目选择Add framework support... 如果没有,可以参考idea2023版如何新建web项目 2.添加web支持 ​ 3.效果 ​ 注意: 不要先添加打包方式将web目录要拖拽到main目录下,并改名为…

金和OA C6 HomeService.asmx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 HomeService.asmx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

个人笔记:分布式大数据技术原理(一)Hadoop 框架

大家想了解更多大数据相关内容请移驾我的课堂: 大数据相关课程 剖析及实践企业级大数据 数据架构规划设计 大厂架构师知识梳理:剖析及实践数据建模 剖析及实践数据资产运营平台 Apache Hadoop 软件库是一个框架,它允许使用简单的编程模型&…

【C语言】TCP测速程序

一、服务端 下面是一个用 C 语言编写的测试 TCP 传输速度的基本程序示例。 这只是一个简单示例&#xff0c;没有做详细的错误检查和边缘情况处理。在实际应用中&#xff0c;可能需要增加更多的功能和完善的异常处理机制。 TCP 服务器 (server.c): #include <stdio.h> #…

Rust学习笔记:基础概念介绍(一)

Rust背景 让我们从Rust语言的背景开始&#xff0c;探索它的起源。Rust最初是Mozilla研究院在2006年的一个个人项目。第一个稳定的公开版本发布于2015年5月&#xff0c;但在此之前Mozilla已经在生产软件中使用了Rust。2021年&#xff0c;Rust基金会成立&#xff0c;其宪章是管理…

1.9.。。

1 有道云笔记 2 .cpp #include "mywidget.h" #include "ui_mywidget.h"myWidget::myWidget(QWidget *parent) :QWidget(parent),ui(new Ui::myWidget) {ui->setupUi(this);this->setWindowTitle("原神");this->setStyleSheet("…

35岁程序员,坐标杭州,月薪3W,退休时能领多少钱?

35岁程序员&#xff0c;坐标杭州&#xff0c;月薪3W&#xff0c;退休时能领多少钱&#xff1f; 作为一个35岁的程序员&#xff0c;生活在繁华的杭州这座城市&#xff0c;每个月能够拿到3万元的薪水&#xff0c;是一种相对较高的收入水平。然而&#xff0c;随着时间的推移&…

旋变检测AD2s1205手册学习笔记

旋变故障检测故障表 信号丢失检测 检测原理&#xff1a;任一旋变输入(正弦或余弦)降至指定的LOS正弦/余弦阈值 以下时&#xff0c;器件会检测到信号丢失(LOS)。AD2S1205通过将 监视信号与固定最小值进行比较检测此点 丢失的效果表现&#xff1a;LOS由DOS和LOT引脚均闩锁为逻辑…

最新ThinkPHP版本实现证书查询系统,实现批量数据导入,自动生成电子证书

前提&#xff1a;朋友弄了一个培训机构&#xff0c;培训考试合格后&#xff0c;给发证书&#xff0c;需要一个证书查询系统。委托我给弄一个&#xff0c;花了几个晚上给写的证书查询系统。 实现功能&#xff1a; 前端按照姓名手机号码进行证书查询证书信息展示证书展示&#x…

CTF-PWN-栈溢出-中级ROP-【栈迁移】

文章目录 栈迁移具体流程 VNCTF 2023 traveler libc-2.27检查源码main函数![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/386c35c30f854434ae43667b9473c58a.png)全局变量地址局部变量地址 PIE保护开启PIE关闭PIE 思路exp 栈迁移参考 栈迁移参考 栈迁移 顾名思义…