在 Pytorch 中,squeeze 和 unsqueeze 是两个非常有用的函数。它们用于在张量(tensor)中增加或减少维度。主要作用是对张量进行维度的调整和变换,方便进行各种矩阵和向量运算。
具体来说,squeeze 是用来减少维度的函数,它会去除张量中维度为1的维度,从而使张量变得更紧凑。而 unsqueeze 则是用来增加维度的函数,它会在张量的指定位置增加一个维度。
squeeze 函数的用法非常简单,它只接受一个参数,即要进行维度减少的张量。下面是一个示例:
import torch
# 创建一个维度为 (1, 3, 1, 5) 的张量
x = torch.randn(1, 3, 1, 5)
# 使用 squeeze 函数减少维度
y = torch.squeeze(x)
print("原始张量 x 的维度:", x.size())
print("减少维度后的张量 y 的维度:", y.size())
运行以上代码,我们可以得到如下输出:
原始张量 x 的维度: torch.Size([1, 3, 1, 5])
减少维度后的张量 y 的维度: torch.Size([3, 5])
可以看到,原始张量 x 的维度是 (1, 3, 1, 5),其中第一个和第三个维度都是1。而经过 squeeze 函数处理后,张量 y 的维度变为了 (3, 5),去除了原始张量中那些为1的维度。
unsqueeze 函数的用法稍微复杂一些,它需要接受两个参数,第一个是要增加维度的张量,第二个是指定要增加的位置。下面是一个示例1:
import torch
# 创建一个维度为 (3, 5) 的张量
x = torch.randn(3, 5)
# 使用 unsqueeze 函数增加维度
y = torch.unsqueeze(x, 0)
print("原始张量 x 的维度:", x.size())
print("增加维度后的张量 y 的维度:", y.size())
运行以上代码,我们可以得到如下输出:
原始张量 x 的维度: torch.Size([3, 5])
增加维度后的张量 y 的维度: torch.Size([1, 3, 5])
可以看到,原始张量 x 的维度是 (3, 5),而经过 unsqueeze 函数处理后,我们在第一个位置增加了一个维度,使得张量 y 的维度变为了 (1, 3, 5),增加了一个长度为1的维度。
为了更好的说明unsqueeze 函数的用法,下面是一个示例2:
import torch
# 创建一个一维张量
x = torch.tensor([1, 2, 3, 4])
# 在第0维增加一个新维度
x_unsqueeze_0 = torch.unsqueeze(x, 0)
print(x_unsqueeze_0)
# 输出: tensor([[1, 2, 3, 4]])
# 在第1维增加一个新维度
x_unsqueeze_1 = torch.unsqueeze(x, 1)
print(x_unsqueeze_1)
# 输出: tensor([[1], [2], [3], [4]])
unsqueeze函数接受两个参数:输入张量和要插入新维度的索引。索引可以是正数或负数,负数索引表示从张量的末尾开始计算。例如,-1表示在最后一个维度之前添加一个新维度。
重要提醒1:这个函数不会改变原始张量的数据,而是返回一个新的张量,新张量与原始张量共享相同的数据,但形状不同。这意味着对新张量的修改也会影响原始张量,因为它们共享相同的内存。
重要提醒2:使用unsqueeze时需要注意维度索引,以确保提供的维度索引在允许的范围内,即[-input.dim()-1, input.dim()+1)。