新手能掌握 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_bottom 和 W_out = W_in + padding_left + padding_right。这里的 H_out 和 W_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_bottom 和 W_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_back,H_out = H_in + padding_top + padding_bottom,W_out = W_in + padding_left + padding_right。这里的 D_out、H_out 和 W_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_back、H_out = H_in + padding_top + padding_bottom 和 W_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_bottom 和 W_out = W_in + padding_left + padding_right。这里的 H_out 和 W_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_bottom 和 W_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_back,H_out = H_in + padding_top + padding_bottom,W_out = W_in + padding_left + padding_right。这里的 D_out、H_out 和 W_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_back、H_out = H_in + padding_top + padding_bottom 和 W_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_bottom 和 W_out = W_in + padding_left + padding_right。这里的 H_out 和 W_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_bottom 和 W_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_back,H_out = H_in + padding_top + padding_bottom,W_out = W_in + padding_left + padding_right。这里的 D_out、H_out 和 W_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_back、H_out = H_in + padding_top + padding_bottom 和 W_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_bottom 和 W_out = W_in + padding_left + padding_right。这里的 H_out 和 W_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_bottom 和 W_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_back,H_out = H_in + padding_top + padding_bottom,W_out = W_in + padding_left + padding_right。这里的 D_out、H_out 和 W_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_back、H_out = H_in + padding_top + padding_bottom 和 W_out = W_in + padding_left + padding_right 描述了输出的深度(D_out)、高度(H_out)和宽度(W_out)是如何基于输入的深度(D_in)、高度(H_in)、宽度(W_in)以及各边的填充大小和填充值计算出来的。

总结

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

相关推荐
龙腾AI白云4 分钟前
【轻量化大模型:低成本AI落地的产业新范式】
大数据·数据库·人工智能·机器学习
v:PLLucky201 小时前
眼部疾病智能检测系统
算法·yolo·机器学习·百度·facebook
Omics Pro1 小时前
00后大3休学创业!AI虚拟细胞
大数据·数据库·人工智能·算法·机器学习·自然语言处理
workflower1 小时前
从生成式模型开始的技术延伸
人工智能·机器学习·机器人·云计算·无人机
卷毛迷你猪1 小时前
快速实验篇(B11)用户 RFM 与聚类分群实战
机器学习·数据挖掘·聚类
论文复现现场1 小时前
RTX 3090 24GB 适合科研吗?单卡论文复现、PyTorch 显存检查与 OOM 排错
人工智能·pytorch·python·深度学习·cuda·rtx3090
言乐62 小时前
Python根据关联词搜索模型
开发语言·人工智能·python·机器学习·django
7yewh2 小时前
SLAM 非线性优化(5)
人工智能·机器学习
draracle2 小时前
AI正在批量制造屎山:Vibe Coding的认识论批判
人工智能·深度学习
倔强的石头1062 小时前
【Transformer】上下文长度扩展技术综述
人工智能·深度学习·transformer