新手能掌握 PyTorch 的填充技术:深入理解反射、复制、零值和常数填充

目录

torch.nn子模块详解

nn.ReflectionPad1d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ReflectionPad2d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ReflectionPad3d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ReplicationPad1d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ReplicationPad2d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ReplicationPad3d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ZeroPad1d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ZeroPad2d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ZeroPad3d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ConstantPad1d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ConstantPad2d

参数说明:

形状(Shape):

使用示例:

注意事项:

nn.ConstantPad3d

参数说明:

形状(Shape):

使用示例:

注意事项:

总结


torch.nn子模块详解

nn.ReflectionPad1d

torch.nn.ReflectionPad1d 是 PyTorch 深度学习框架中的一个类,用于对输入的张量(tensor)进行边界反射填充。这意味着它会复制输入张量的边界值来增加其大小。这种填充方式常用于卷积神经网络中,以保持数据的空间维度。

参数说明:

  • padding:这个参数可以是一个整数或一个二元组(tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是二元组,它表示左右两边的填充大小,格式为 (padding_left, padding_right)

形状(Shape):

  • 输入:其形状可以是 (C, W)(N, C, W),其中 C 是通道数,W 是输入宽度,N 是批大小(如果有的话)。
  • 输出:形状为 (C, W_out)(N, C, W_out),其中 W_out = W_in + padding_left + padding_right。这里,W_out 是填充后的宽度。

使用示例:

1. 基本使用 :如果你使用 nn.ReflectionPad1d(2),这意味着在输入张量的每一边添加两个单位的反射填充。

python 复制代码
m = nn.ReflectionPad1d(2)
input = torch.arange(8, dtype=torch.float).reshape(1, 2, 4)
output = m(input)

这将在输入张量的左右两侧分别添加两个单位的反射填充。

2. 使用不同的填充大小 :你可以通过传递一个二元组来为左右两边设置不同的填充大小,比如 nn.ReflectionPad1d((3, 1))

python 复制代码
m = nn.ReflectionPad1d((3, 1))
output = m(input)

这将在输入张量的左边添加三个单位,右边添加一个单位的反射填充。

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 边界效应:由于反射填充是通过复制边缘值实现的,因此在某些情况下可能会引入不希望的边界效应。
  • 使用场景:反射填充在视觉任务中特别有用,因为它可以保持图像边缘的连续性,而不是简单地填充零或其他值。

在数学公式中,W_out = W_in + padding_left + padding_right 描述了输出宽度(W_out)是如何根据输入宽度(W_in)以及左右两侧的填充大小计算出来的。

nn.ReflectionPad2d

torch.nn.ReflectionPad2d 是 PyTorch 框架中用于二维数据的一个填充类,它使用输入边界的反射进行填充。这种类型的填充在处理图像或其他二维数据时非常有用,尤其是在进行卷积操作时,需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个四元组(4-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是四元组,它表示四个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom)

形状(Shape):

  • 输入:其形状可以是 (N, C, H_in, W_in)(C, H_in, W_in),其中 N 是批大小,C 是通道数,H_in 是输入高度,W_in 是输入宽度。
  • 输出:形状为 (N, C, H_out, W_out)(C, H_out, W_out),其中 H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 H_outW_out 分别是填充后的高度和宽度。

使用示例:

  1. 基本使用 :如果使用 nn.ReflectionPad2d(2),这意味着在所有四个边界上添加两个单位的反射填充。
python 复制代码
m = nn.ReflectionPad2d(2)
input = torch.arange(9, dtype=torch.float).reshape(1, 1, 3, 3)
output = m(input)

这将在输入张量的每一边添加两个单位的反射填充。

  1. 使用不同的填充大小 :你可以传递一个四元组来为每个边界设置不同的填充大小,比如 nn.ReflectionPad2d((1, 1, 2, 0))
python 复制代码
m = nn.ReflectionPad2d((1, 1, 2, 0))
output = m(input)

这将在输入张量的左、右边各添加一个单位,顶部添加两个单位,底部不添加填充的反射填充。

注意事项:

  • 数据类型:确保输入数据的类型与模型其他部分一致。
  • 边界效应:反射填充通过复制边缘值,可能在某些情况下引入边界效应,需要注意这一点。
  • 适用场景:反射填充尤其适用于视觉任务,因为它在填充时保持了图像边缘的连续性。

在数学公式中,H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的高度(H_out)和宽度(W_out)是如何基于输入的高度(H_in)、宽度(W_in)以及各边的填充大小计算出来的。

nn.ReflectionPad3d

torch.nn.ReflectionPad3d 是 PyTorch 深度学习框架中的一个类,专门用于对三维数据进行反射填充。这种填充方式在处理三维数据(如体积数据或视频帧)时非常有用,尤其是在卷积神经网络中需要保持数据尺寸不变的场景中。

参数说明:

  • padding:这个参数可以是一个整数或一个六元组(6-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是六元组,它表示六个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom, padding_front, padding_back)

形状(Shape):

  • 输入:其形状可以是 (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, D_out, H_out, W_out)(C, D_out, H_out, W_out),其中 D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 D_outH_outW_out 分别是填充后的深度、高度和宽度。

使用示例:

基本使用 :如果使用 nn.ReflectionPad3d(1),这意味着在所有六个边界上添加一个单位的反射填充。

python 复制代码
m = nn.ReflectionPad3d(1)
input = torch.arange(8, dtype=torch.float).reshape(1, 1, 2, 2, 2)
output = m(input)

这将在输入张量的每一个边界添加一个单位的反射填充。

使用不同的填充大小:你可以传递一个六元组来为每个边界设置不同的填充大小。

python 复制代码
# 示例:设置不同的填充大小
m = nn.ReflectionPad3d((1, 1, 2, 0, 1, 2))
# 然后使用 m(input) 来应用填充

这将在输入张量的不同边界上添加不同大小的反射填充。

注意事项:

  • 数据类型:确保输入数据的类型与模型其他部分一致。
  • 边界效应:反射填充通过复制边缘值,可能在某些情况下引入边界效应,需要特别注意。
  • 适用场景:反射填充尤其适用于处理三维数据,如医学图像、视频处理等领域。

在数学公式中,D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的深度(D_out)、高度(H_out)和宽度(W_out)是如何基于输入的深度(D_in)、高度(H_in)、宽度(W_in)以及各边的填充大小计算出来的。

nn.ReplicationPad1d

torch.nn.ReplicationPad1d 是 PyTorch 框架中用于一维数据的填充类,它通过复制输入边界的值来进行填充。这种填充方式在处理一维序列数据(如时间序列、音频信号等)时非常有用,尤其是在进行卷积操作时需要保持数据长度不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个二元组(tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是二元组,它表示左右两边的填充大小,格式为 (padding_left, padding_right)

形状(Shape):

  • 输入:其形状可以是 (C, W_in)(N, C, W_in),其中 C 是通道数,W_in 是输入宽度,N 是批大小(如果有的话)。
  • 输出:形状为 (C, W_out)(N, C, W_out),其中 W_out = W_in + padding_left + padding_right。这里的 W_out 是填充后的宽度。

使用示例:

  1. 基本使用 :如果使用 nn.ReplicationPad1d(2),这意味着在输入张量的每一边添加两个单位的复制填充。
python 复制代码
m = nn.ReplicationPad1d(2)
input = torch.arange(8, dtype=torch.float).reshape(1, 2, 4)
output = m(input)

这将在输入张量的左右两侧分别添加两个单位的复制填充。

2. 使用不同的填充大小 :你可以通过传递一个二元组来为左右两边设置不同的填充大小,比如 nn.ReplicationPad1d((3, 1))

python 复制代码
m = nn.ReplicationPad1d((3, 1))
output = m(input)

这将在输入张量的左边添加三个单位,右边添加一个单位的复制填充。

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:由于复制填充是通过重复边缘值实现的,因此在某些情况下可能会引入不希望的效果,特别是在边缘值与邻近数据差异较大时。
  • 使用场景:复制填充在处理一维数据时特别有用,因为它在填充时尽可能保持了数据的局部特性。

在数学公式中,W_out = W_in + padding_left + padding_right 描述了输出宽度(W_out)是如何根据输入宽度(W_in)以及左右两侧的填充大小计算出来的。

nn.ReplicationPad2d

torch.nn.ReplicationPad2d 是 PyTorch 框架中用于二维数据的填充类,它通过复制输入边界的值来进行填充。这种填充方式在处理图像或其他二维数据时非常有用,尤其是在进行卷积操作时需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个四元组(4-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是四元组,它表示四个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom)

形状(Shape):

  • 输入:其形状可以是 (N, C, H_in, W_in)(C, H_in, W_in),其中 N 是批大小,C 是通道数,H_in 是输入高度,W_in 是输入宽度。
  • 输出:形状为 (N, C, H_out, W_out)(C, H_out, W_out),其中 H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 H_outW_out 分别是填充后的高度和宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ReplicationPad2d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ReplicationPad2d(2)
input = torch.arange(9, dtype=torch.float).reshape(1, 1, 3, 3)
output_same_padding = m_same_padding(input)

# 使用不同的填充大小
m_different_padding = nn.ReplicationPad2d((1, 1, 2, 0))
output_different_padding = m_different_padding(input)

# 打印输出
print("Output with same padding on all sides:\n", output_same_padding)
print("\nOutput with different padding:\n", output_different_padding)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:由于复制填充是通过重复边缘值实现的,因此在某些情况下可能会引入不希望的效果,特别是在边缘值与邻近数据差异较大时。
  • 使用场景:复制填充在处理二维数据时特别有用,因为它在填充时尽可能保持了数据的局部特性。

在数学公式中,H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的高度(H_out)和宽度(W_out)是如何基于输入的高度(H_in)、宽度(W_in)以及各边的填充大小计算出来的。

nn.ReplicationPad3d

torch.nn.ReplicationPad3d 是 PyTorch 框架中用于三维数据的填充类,它通过复制输入边界的值来进行填充。这种填充方式在处理三维数据(如体积数据、三维图像)时非常有用,尤其是在进行卷积操作时需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个六元组(6-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是六元组,它表示六个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom, padding_front, padding_back)

形状(Shape):

  • 输入:其形状可以是 (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, D_out, H_out, W_out)(C, D_out, H_out, W_out),其中 D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 D_outH_outW_out 分别是填充后的深度、高度和宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ReplicationPad3d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ReplicationPad3d(3)
input = torch.randn(16, 3, 8, 320, 480)
output_same_padding = m_same_padding(input)

# 使用不同的填充大小
m_different_padding = nn.ReplicationPad3d((3, 3, 6, 6, 1, 1))
output_different_padding = m_different_padding(input)

# 打印输出
print("Output with same padding on all sides:\n", output_same_padding.shape)
print("\nOutput with different padding:\n", output_different_padding.shape)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:由于复制填充是通过重复边缘值实现的,因此在某些情况下可能会引入不希望的效果,特别是在边缘值与邻近数据差异较大时。
  • 使用场景:复制填充在处理三维数据时特别有用,因为它在填充时尽可能保持了数据的局部特性。

在数学公式中,D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的深度(D_out)、高度(H_out)和宽度(W_out)是如何基于输入的深度(D_in)、高度(H_in)、宽度(W_in)以及各边的填充大小计算出来的。

nn.ZeroPad1d

torch.nn.ZeroPad1d 是 PyTorch 框架中用于一维数据的填充类,它通过在输入张量的边界添加零来进行填充。这种填充方式在处理一维序列数据(如时间序列、音频信号等)时非常有用,尤其是在进行卷积操作时需要保持数据长度不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个二元组(tuple)。如果是整数,它会在两边边界上应用相同的填充大小。如果是二元组,它表示左右两边的填充大小,格式为 (padding_left, padding_right)

形状(Shape):

  • 输入:其形状可以是 (C, W_in)(N, C, W_in),其中 C 是通道数,W_in 是输入宽度,N 是批大小(如果有的话)。
  • 输出:形状为 (C, W_out)(N, C, W_out),其中 W_out = W_in + padding_left + padding_right。这里的 W_out 是填充后的宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ZeroPad1d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ZeroPad1d(2)
input1 = torch.randn(1, 2, 4)
output1 = m_same_padding(input1)

# 使用不同的填充大小
m_different_padding = nn.ZeroPad1d((3, 1))
input2 = torch.randn(1, 2, 3)
output2 = m_different_padding(input2)

# 打印输出
print("Output with same padding on both sides:\n", output1)
print("\nOutput with different padding:\n", output2)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:零填充会在序列的边界添加零值,这可能会对模型产生特定的影响,尤其是在模型需要解释边界信息时。
  • 使用场景:零填充在处理一维数据时特别有用,尤其是在需要保持数据长度不变时。

在数学公式中,W_out = W_in + padding_left + padding_right 描述了输出宽度(W_out)是如何根据输入宽度(W_in)以及左右两侧的填充大小计算出来的。

nn.ZeroPad2d

torch.nn.ZeroPad2d 是 PyTorch 框架中用于二维数据的填充类,它通过在输入张量的边界添加零来进行填充。这种填充方式在处理图像或其他二维数据时非常有用,尤其是在进行卷积操作时需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个四元组(4-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是四元组,它表示四个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom)

形状(Shape):

  • 输入:其形状可以是 (N, C, H_in, W_in)(C, H_in, W_in),其中 N 是批大小,C 是通道数,H_in 是输入高度,W_in 是输入宽度。
  • 输出:形状为 (N, C, H_out, W_out)(C, H_out, W_out),其中 H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 H_outW_out 分别是填充后的高度和宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ZeroPad2d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ZeroPad2d(2)
input1 = torch.randn(1, 1, 3, 3)
output1 = m_same_padding(input1)

# 使用不同的填充大小
m_different_padding = nn.ZeroPad2d((1, 1, 2, 0))
input2 = torch.randn(1, 1, 3, 3)
output2 = m_different_padding(input2)

# 打印输出
print("Output with same padding on all sides:\n", output1)
print("\nOutput with different padding:\n", output2)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:零填充会在图像的边界添加零值,这可能会对模型产生特定的影响,尤其是在模型需要解释边界信息时。
  • 使用场景:零填充在处理二维数据时特别有用,尤其是在需要保持数据尺寸不变时。

在数学公式中,H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的高度(H_out)和宽度(W_out)是如何基于输入的高度(H_in)、宽度(W_in)以及各边的填充大小计算出来的。

nn.ZeroPad3d

torch.nn.ZeroPad3d 是 PyTorch 框架中用于三维数据的填充类,它通过在输入张量的边界添加零来进行填充。这种填充方式在处理三维数据(如体积数据、三维图像等)时非常有用,尤其是在进行卷积操作时需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个六元组(6-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是六元组,它表示六个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom, padding_front, padding_back)

形状(Shape):

  • 输入:其形状可以是 (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, D_out, H_out, W_out)(C, D_out, H_out, W_out),其中 D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 D_outH_outW_out 分别是填充后的深度、高度和宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ZeroPad3d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ZeroPad3d(3)
input1 = torch.randn(16, 3, 10, 20, 30)
output1 = m_same_padding(input1)

# 使用不同的填充大小
m_different_padding = nn.ZeroPad3d((3, 3, 6, 6, 0, 1))
output2 = m_different_padding(input1)

# 打印输出
print("Output with same padding on all sides:\n", output1.shape)
print("\nOutput with different padding:\n", output2.shape)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:零填充会在三维数据的边界添加零值,这可能会对模型产生特定的影响,尤其是在模型需要解释边界信息时。
  • 使用场景:零填充在处理三维数据时特别有用,尤其是在需要保持数据尺寸不变时。

在数学公式中,D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的深度(D_out)、高度(H_out)和宽度(W_out)是如何基于输入的深度(D_in)、高度(H_in)、宽度(W_in)以及各边的填充大小计算出来的。

nn.ConstantPad1d

torch.nn.ConstantPad1d 是 PyTorch 框架中用于一维数据的填充类,它通过在输入张量的边界添加一个常数值来进行填充。这种填充方式在处理一维序列数据(如时间序列、音频信号等)时非常有用,尤其是在进行卷积操作时需要保持数据长度不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个二元组(tuple)。如果是整数,它会在两边边界上应用相同的填充大小。如果是二元组,它表示左右两边的填充大小,格式为 (padding_left, padding_right)
  • value:填充的常数值。

形状(Shape):

  • 输入:其形状可以是 (C, W_in)(N, C, W_in),其中 C 是通道数,W_in 是输入宽度,N 是批大小(如果有的话)。
  • 输出:形状为 (C, W_out)(N, C, W_out),其中 W_out = W_in + padding_left + padding_right。这里的 W_out 是填充后的宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ConstantPad1d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ConstantPad1d(2, 3.5)
input1 = torch.randn(1, 2, 4)
output1 = m_same_padding(input1)

# 使用不同的填充大小
m_different_padding = nn.ConstantPad1d((3, 1), 3.5)
input2 = torch.randn(1, 2, 3)
output2 = m_different_padding(input2)

# 打印输出
print("Output with same padding on both sides:\n", output1)
print("\nOutput with different padding:\

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:常数填充会在序列的边界添加特定的常数值,这可能会对模型产生特定的影响,尤其是在模型需要解释边界信息时。
  • 使用场景:常数填充在处理一维数据时特别有用,尤其是在需要保持数据长度不变时。

在数学公式中,W_out = W_in + padding_left + padding_right 描述了输出宽度(W_out)是如何根据输入宽度(W_in)以及左右两侧的填充大小和填充值计算出来的。

nn.ConstantPad2d

torch.nn.ConstantPad2d 是 PyTorch 框架中用于二维数据的填充类,它通过在输入张量的边界添加一个常数值来进行填充。这种填充方式在处理图像或其他二维数据时非常有用,尤其是在进行卷积操作时需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个四元组(4-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是四元组,它表示四个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom)
  • value:填充的常数值。

形状(Shape):

  • 输入:其形状可以是 (N, C, H_in, W_in)(C, H_in, W_in),其中 N 是批大小,C 是通道数,H_in 是输入高度,W_in 是输入宽度。
  • 输出:形状为 (N, C, H_out, W_out)(C, H_out, W_out),其中 H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 H_outW_out 分别是填充后的高度和宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ConstantPad2d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ConstantPad2d(2, 3.5)
input1 = torch.randn(1, 2, 2)
output1 = m_same_padding(input1)

# 使用不同的填充大小
m_different_padding = nn.ConstantPad2d((3, 0, 2, 1), 3.5)
output2 = m_different_padding(input1)

# 打印输出
print("Output with same padding on all sides:\n", output1)
print("\nOutput with different padding:\n", output2)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:常数填充会在图像的边界添加特定的常数值,这可能会对模型产生特定的影响,尤其是在模型需要解释边界信息时。
  • 使用场景:常数填充在处理二维数据时特别有用,尤其是在需要保持数据尺寸不变时。

在数学公式中,H_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的高度(H_out)和宽度(W_out)是如何基于输入的高度(H_in)、宽度(W_in)以及各边的填充大小和填充值计算出来的。

nn.ConstantPad3d

torch.nn.ConstantPad3d 是 PyTorch 框架中用于三维数据的填充类,它通过在输入张量的边界添加一个常数值来进行填充。这种填充方式在处理三维数据(如体积数据、三维图像等)时非常有用,尤其是在进行卷积操作时需要保持数据尺寸不变的情况下。

参数说明:

  • padding:这个参数可以是一个整数或一个六元组(6-tuple)。如果是整数,它会在所有边界上应用相同的填充大小。如果是六元组,它表示六个边界的填充大小,格式为 (padding_left, padding_right, padding_top, padding_bottom, padding_front, padding_back)
  • value:填充的常数值。

形状(Shape):

  • 输入:其形状可以是 (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, D_out, H_out, W_out)(C, D_out, H_out, W_out),其中 D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right。这里的 D_outH_outW_out 分别是填充后的深度、高度和宽度。

使用示例:

以下是一个整合的示例,展示了如何使用 nn.ConstantPad3d,包括使用相同的填充大小和不同的填充大小两种情况:

python 复制代码
import torch
import torch.nn as nn

# 使用相同的填充大小
m_same_padding = nn.ConstantPad3d(3, 3.5)
input1 = torch.randn(16, 3, 10, 20, 30)
output1 = m_same_padding(input1)

# 使用不同的填充大小
m_different_padding = nn.ConstantPad3d((3, 3, 6, 6, 0, 1), 3.5)
output2 = m_different_padding(input1)

# 打印输出
print("Output with same padding on all sides:\n", output1.shape)
print("\nOutput with different padding:\n", output2.shape)

注意事项:

  • 数据类型:确保输入数据的类型(如 float32)与你的模型其他部分一致。
  • 填充效果:常数填充会在三维数据的边界添加特定的常数值,这可能会对模型产生特定的影响,尤其是在模型需要解释边界信息时。
  • 使用场景:常数填充在处理三维数据时特别有用,尤其是在需要保持数据尺寸不变时。

在数学公式中,D_out = D_in + padding_front + padding_backH_out = H_in + padding_top + padding_bottomW_out = W_in + padding_left + padding_right 描述了输出的深度(D_out)、高度(H_out)和宽度(W_out)是如何基于输入的深度(D_in)、高度(H_in)、宽度(W_in)以及各边的填充大小和填充值计算出来的。

总结

本文详细介绍了 PyTorch 框架中的多个填充类,用于在深度学习模型中处理不同维度的数据。这些填充方法对于保持卷积神经网络中数据的空间维度至关重要,尤其在图像处理、音频信号处理等领域中有广泛应用。每种填充方法都有其特定的应用场景和注意事项,如数据类型一致性、边界效应的考虑等。文章通过具体的代码示例展示了如何在 PyTorch 中使用这些填充类,并解释了它们的工作原理。

相关推荐
可喜~可乐7 分钟前
循环神经网络(RNN)入门指南:从原理到实践
人工智能·rnn·深度学习·神经网络·机器学习·lstm
Adenialzz39 分钟前
Rectified Flow 原理简介与示例代码解读
人工智能·深度学习·机器学习·计算机视觉·diffusion
winner88811 小时前
强化学习基础之贝尔曼期望方程
深度学习·贝尔曼方程·马尔科夫链
看星猩的柴狗1 小时前
机器学习-高斯混合模型
人工智能·机器学习
power-辰南2 小时前
机器学习之数据分析及特征工程详细分析过程
人工智能·python·机器学习·大模型·特征
少说多想勤做2 小时前
【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
人工智能·深度学习·神经网络·目标检测·计算机视觉·目标跟踪·aaai
橙子小哥的代码世界4 小时前
【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用
图像处理·人工智能·深度学习·神经网络·计算机视觉·分类·卷积神经网络
leigm1234 小时前
深度学习使用Anaconda打开Jupyter Notebook编码
人工智能·深度学习·jupyter
FreedomLeo17 小时前
Python机器学习笔记(十三、k均值聚类)
python·机器学习·kmeans·聚类
阿正的梦工坊7 小时前
深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)
人工智能·pytorch·python