【PyTorch单点知识】 Padding填充:torch.nn.ConstantPad2d和torch.nn.ZeroPad2d

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

在深度学习领域,卷积神经网络(Convolutional Neural Networks, CNNs)被广泛应用于计算机视觉任务中,例如图像分类、目标检测和语义分割等。为了保证卷积层的有效性和特征提取的完整性,通常会在输入数据周围添加额外的像素值,这一过程被称为“padding”。本文将重点介绍两种常见的padding技术:torch.nn.ConstantPad2dtorch.nn.ZeroPad2d,并探讨它们的应用场景。

1. Padding的概念

Padding是指在输入张量的边缘添加额外的值。这些额外的值可以帮助保持输出张量的尺寸与输入张量相同,或者增加输入张量的尺寸以适应特定的卷积核大小。Padding对于保持特征图的尺寸不变以及避免边界效应至关重要。

2. ConstantPad2d

torch.nn.ConstantPad2d 是一种常数填充的方法,它可以将一个指定的常数值填充到输入张量的边缘。这种填充方式在一些特定的应用场景中非常有用,比如在需要保持输入张量的边界特征时。

  1. 参数说明
  • pad: 一个四元组,定义了填充的顺序和数量,格式为 (left, right, top, bottom)。
  • value: 填充的常数值。
  1. 示例代码
import torch
import torch.nn as nn

# 创建一个简单的四维张量
input_tensor = torch.randn(3, 3)

# 定义常数填充层
constant_pad = nn.ConstantPad2d((2, 2, 2, 2), value=0.1)

# 应用常数填充
output_tensor = constant_pad(input_tensor)

# 打印输入输出张量的形状
print(input_tensor)
print(output_tensor)

在这个示例中,我们创建了一个形状为 torch.Size([3,3]) 的输入张量,并使用 nn.ConstantPad2d((2, 2, 2, 2), value=0.1) 来指定在每个边缘填充2个像素,并且填充值为0.1。这样输出张量的尺寸将会变为 torch.Size([7, 7])

最终输出为:

tensor([[-0.0327,  0.9586,  0.5899],
        [ 0.3477,  0.9931, -0.3527],
        [-0.2151, -0.5508, -0.0132]])
tensor([[ 0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000],
        [ 0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000],
        [ 0.1000,  0.1000, -0.0327,  0.9586,  0.5899,  0.1000,  0.1000],
        [ 0.1000,  0.1000,  0.3477,  0.9931, -0.3527,  0.1000,  0.1000],
        [ 0.1000,  0.1000, -0.2151, -0.5508, -0.0132,  0.1000,  0.1000],
        [ 0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000],
        [ 0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000,  0.1000]])

3. ZeroPad2d

torch.nn.ZeroPad2d 是一种特殊的常数填充方法,其中填充的值固定为0。这种方式在很多情况下都是默认的选择,因为它不会引入额外的噪声。

  1. 参数说明
  • pad: 一个四元组,定义了填充的顺序和数量,格式为 (left, right, top, bottom)。
  1. 示例代码
import torch
import torch.nn as nn

# 创建一个简单的四维张量
input_tensor = torch.randn(3, 3)

# 定义零填充层
zero_pad = nn.ZeroPad2d((2, 2, 2, 2))

# 应用零填充
output_tensor = zero_pad(input_tensor)

# 打印输出张量的形状
print("Output shape:", output_tensor.shape)

这个示例与上一个类似,只是填充值为0。输出张量的尺寸同样为 torch.Size([7,7])

4. 应用场景

这两种填充方法都有各自适用的场景:

  1. 图像分类:在图像分类任务中,零填充是最常用的方式,因为它简单且有效,不会影响模型的学习能力。
  2. 目标检测:在目标检测中,如果需要保持边界信息的不变性,可以使用常数填充,并选择一个合适的填充值来代表背景。
  3. 语义分割:在语义分割任务中,零填充通常用于扩大输入图像的尺寸,以适应较大的卷积核。

5. 总结

torch.nn.ConstantPad2dtorch.nn.ZeroPad2d 都是PyTorch中常用的填充方法,它们分别使用常数值和0来进行填充。选择哪种填充方式取决于具体的应用场景和个人偏好。在实际开发中,理解这些填充方法的原理及其对模型性能的影响是非常重要的。

猜你喜欢

转载自blog.csdn.net/m0_49963403/article/details/141297448