1.torch.stack()
torch.stack()
函数会将一个元素为张量的序列(列表、元组等)沿着新的维度进行拼接,生成一个新的张量。例如,如果有一个包含 n 个 k维张量的序列,那么它们拼接后的张量就会是 (n, k) 维的。
如果我们将视频的每一帧作为一个张量,存储在列表 frames
中,torch.stack(frames)
的作用就是将所有的帧拼接成一个新的张量 x
。假设视频总共有 m 帧,那么 x
的形状就是 (m, c, h, w),其中 c、h、w 分别表示图像的通道数、高度、宽度。因为视频中的每一帧都具有相同的形状,所以 torch.stack()
可以正确地将这些张量拼接在一起,形成一个四维张量。
2.F.interpolate
F.interpolate()
是PyTorch中的函数,用于对张量进行插值操作,从而改变其尺寸。具体来说,该函数可以对二维或三维输入张量进行插值,支持各种插值算法,例如最近邻插值、双线性插值和三线性插值等。
函数的参数说明如下:
input
:输入的张量;size
:输出张量的尺寸;scale_factor
:输出张量与输入张量的比例系数;mode
:插值算法,可以是“nearest”(最近邻插值)、“bilinear”(双线性插值)、“bicubic”(三次样条插值)、“trilinear”(三线性插值)等;align_corners
:在进行插值时,是否将像素点放在输入张量的角落。如果该参数为True,则像素点会放在输入张量的角落,否则会放在输入张量的中心。
划重点:
-
输入张量的形状必须是4维的,具体形状是 (batch_size, channels, height, width)。
-
其中,batch_size和channels是可以为1的,表示只有1个样本和1个通道。
-
要对输入张量进行的插值操作必须在height和width两个维度上进行,即必须在后两个维度上指定插值后的目标大小。
-
目标大小的形状是(height, width)。
在进行插值操作时,F.interpolate()函数会自动根据目标大小和原始大小计算出插值的比例,并对输入张量进行插值操作。
函数的返回值为插值后的张量。
举个例子:
假设有一个 2x2 的张量 x,其值为:
tensor([[1, 2],
[3, 4]])
现在我们想把它插值到 4x4 的大小,使用双线性插值的方式,可以这样实现:
import torch.nn.functional as F
x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
# 对张量进行插值,大小为 4x4
y = F.interpolate(x.unsqueeze(0).unsqueeze(0), size=(4, 4), mode='bilinear', align_corners=False)
# 打印输出结果
print(y.squeeze())
》》》
tensor([[1.0000, 1.3333, 1.6667, 2.0000],
[1.6667, 2.0000, 2.3333, 2.6667],
[2.3333, 2.6667, 3.0000, 3.3333],
[3.0000, 3.3333, 3.6667, 4.0000]])
3.unsqueeze_(0)
unsqueeze_(0)
是 PyTorch 中的一个方法,它会在张量的第 0 维(即最前面)增加一个维度。例如,如果原来一个张量的形状为 (3, 5)
,那么执行 unsqueeze_(0)
后,它的形状就变成了 (1, 3, 5)
4.
squeeze()
squeeze()
是一个PyTorch张量操作,用于从张量中删除尺寸为1的维度,并返回新的张量。
如果张量中有一个或多个维度的大小为1,则可以使用squeeze()
将这些维度删除。例如,如果我们有一个形状为(1, 3, 1, 5)
的张量,使用squeeze()
将删除尺寸为1的维度,并返回一个形状为(3, 5)
的新张量。
如果你想指定要删除的维度,则可以使用squeeze(dim)
,其中dim
是要删除的维度的索引。