Pytorch中的一些函数参数讲解

发布于:2024-05-18 ⋅ 阅读:(169) ⋅ 点赞:(0)

卷积中输出尺寸大小的计算

定义几个参数

输入图片大小 W×W
卷积核Filter大小F×F
stride步长为S
padding的像素数 P
于是我们可以得出计算公式为:
N = (W − F + 2F )/S+1,在对N进行向下取整

反卷积中输出尺寸大小的计算

class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, 
          output_padding=0, groups=1, bias=True, dilation=1)

参数的含义如下:

  • in_channels(int) – 输入信号的通道数
  • out_channels(int) – 卷积产生的通道数
  • kerner_size(int or tuple) - 卷积核的大小
  • stride(int or tuple,optional) - 卷积步长,即要将输入扩大的倍数。
  • padding(int or tuple, optional) - 输入的每一条边补充0的层数,高宽都增加2*padding
  • output_padding(int or tuple, optional) - 输出边补充0的层数,高宽都增加padding
  • groups(int, optional) – 从输入通道到输出通道的阻塞连接数
  • bias(bool, optional) - 如果bias=True,添加偏置
  • dilation(int or tuple, optional) – 卷积核元素之间的间距

计算公式如下:

输出尺寸 o u t p u t = ( 输入尺寸 i n p u t − 1 ) ∗ s t r i d e + o u t p u t _ p a d d i n g − 2 ∗ p a d d i n g + k e r n e l _ s i z e 输出尺寸output = (输入尺寸input-1)*stride+output\_padding-2*padding+kernel\_size 输出尺寸output=(输入尺寸input1)stride+output_padding2padding+kernel_size

举个例子吧:

"""输入的是28*28*1024,输出的是56*56*512,使用up-conv2*2"""
import torch
import torch.nn as nn

# 定义一个输入张量
input_tensor = torch.randn(1, 1024, 28, 28)  # 输入大小为 (batch_size, channels, height, width)
print(input_tensor.shape)
conv_transpose = nn.ConvTranspose2d(in_channels=1024, out_channels=512, kernel_size=2, stride=2, padding=0)
output_tensor = conv_transpose(input_tensor)
print(output_tensor.shape)

输出结果如下:

torch.Size([1, 1024, 28, 28])
torch.Size([1, 512, 56, 56])

nn.ReLU(inplace=True)

nn.ReLU(inplace=True) 中的 inplace=True 参数指示是否在原地(in-place)执行操作。如果 inplace=True,则操作会修改输入张量本身,并且返回修改后的张量。如果 inplace=False(默认情况),则会创建一个新的张量来存储操作的结果,并将其返回。

在实际应用中,使用 inplace=True 可以节省内存,因为它避免了创建新的张量,而是直接在原始张量上进行操作。但是,需要注意的是,使用 inplace=True 时,原始张量的值会被修改,这可能会影响到后续的计算或梯度传播。

在上面的代码中,nn.ReLU(inplace=True) 表示使用原地操作执行 ReLU 激活函数,即直接在输入张量上执行 ReLU 操作,并修改输入张量本身,而不是创建一个新的张量来存储结果。

nn.Upsample(scale_factor=2, mode=‘nearest’)

nn.Upsample 函数用于对输入张量进行上采样操作,将其尺寸增大到目标尺寸
下面是 nn.Upsample 函数的全部参数及其说明:

  • size: 可选参数,指定输出张量的目标尺寸。可以是一个整数,表示将输入的每个维度扩展到该尺寸;也可以是一个元组 (H, W),表示将输入的高度和宽度分别扩展到 HW
  • scale_factor: 可选参数,指定尺寸缩放的倍数。可以是一个浮点数或者一个包含两个浮点数的元组 (h_scale, w_scale),分别表示高度和宽度的缩放倍数。
  • mode: 可选参数,指定上采样的模式。可以是以下几种之一:
    • "nearest": 最近邻插值。在每个输出像素位置上,取最近邻的输入像素值作为输出。
    • "linear": 线性插值。根据输入的邻近四个像素的权重,使用双线性插值计算输出像素值。
    • "bilinear": 双线性插值。与 "linear" 相同,但是可以处理多通道的输入。
    • "bicubic": 三次样条插值。使用三次样条插值计算输出像素值。
    • "trilinear": 三线性插值。与 "linear" 类似,但用于三维数据,如体积数据。
  • align_corners: 一个布尔值,用于指定是否将输出的像素中心对齐到输入像素的中心。如果为 True,则输出的像素中心与输入像素中心对齐;如果为 False,则输出的像素中心位于输入像素之间。
  • recompute_scale_factor: 一个布尔值,用于指定是否重新计算缩放因子。如果为 True,则会根据输入和输出的尺寸计算缩放因子;如果为 False,则使用提供的 scale_factor 参数作为缩放因子。

通俗的讲:

“Upsampling”(上采样)是一种常用的图像处理操作,用于将图像或特征图的尺寸增大。在深度学习中,上采样通常用于将低分辨率的特征图恢复到原始输入图像的分辨率,或者增大图像以便进行后续的处理。

在 PyTorch 中,可以使用 torch.nn.Upsample 模块来执行上采样操作。

import torch
import torch.nn as nn

# 创建一个输入特征图,假设大小为 (batch_size, channels, height, width)
input_features = torch.randn(1, 3, 10, 10)
# 定义一个上采样模块,将特征图的大小增大两倍
upsample = nn.Upsample(scale_factor=2, mode='nearest')

# 对输入特征图进行上采样
output_features = upsample(input_features)

print("Input shape:", input_features.shape)
print("Output shape:", output_features.shape)

在这个示例中,我们首先创建了一个大小为 (1, 3, 10, 10) 的输入特征图,其中 1 表示批量大小,3 表示通道数,10x10 表示特征图的高度和宽度。然后,我们定义了一个上采样模块,通过 nn.Upsample 类并设置 scale_factor=2 来指定上采样的倍数。最后,我们将输入特征图通过上采样模块进行上采样,并打印输出特征图的形状。
输出结果如下:

Input shape: torch.Size([1, 3, 10, 10])
Output shape: torch.Size([1, 3, 20, 20])

可以看到,尺寸扩大了一倍
在上述示例中,scale_factor 参数指定了上采样的倍数,mode 参数指定了上采样的插值方法,常见的插值方法包括 ‘nearest’、‘bilinear’ 和 ‘bicubic’ 等。另外,还可以通过设置 size 参数来指定上采样后的特征图大小。

torch.cat()

torch.cat() 是 PyTorch 中用于在指定维度上拼接张量的函数。下面是该函数的参数解释:

  • tensors(张量列表):需要拼接的张量序列,可以是一个张量列表或元组。这些张量在除了指定维度之外的所有维度上的形状必须一致。

  • dim(维度):指定在哪个维度上进行拼接操作。例如,如果 dim=0,则表示在第一个维度(行)上进行拼接;如果 dim=1,则表示在第二个维度(列)上进行拼接,以此类推。默认值为 0。

  • out(输出张量):可选参数,用于指定输出张量。如果提供了此参数,则拼接的结果将会被写入到这个张量中。默认值为 None

  • dtype(数据类型):可选参数,用于指定输出张量的数据类型。默认值为 None,表示结果张量的数据类型与输入张量的数据类型一致。

总之,torch.cat() 函数可以在指定的维度上拼接一系列张量,生成一个新的张量作为输出。通过调整 dim 参数,可以控制拼接的方向,而通过指定 out 参数,可以将结果写入到指定的输出张量中。

举个例子:

我们想要在行的方向上拼接这两个张量,即沿着行的方向将它们连接起来。dim=0

import torch
tensor1 = torch.tensor([[1, 2, 3],
                        [4, 5, 6]])
tensor2 = torch.tensor([[7, 8, 9],
                        [10, 11, 12]])

result = torch.cat((tensor1, tensor2), dim=0)
print(result)

结果如下

tensor([[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]])

如果dim=1,即列方向的拼接
则结果变成了

tensor([[ 1,  2,  3,  7,  8,  9],
        [ 4,  5,  6, 10, 11, 12]])

网站公告

今日签到

点亮在社区的每一天
去签到