卷积中输出尺寸大小的计算
定义几个参数
输入图片大小 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=(输入尺寸input−1)∗stride+output_padding−2∗padding+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)
,表示将输入的高度和宽度分别扩展到H
和W
。 - 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]])