在 Pytorch 中“unsqueeze”有什么作用?

Bob*_*Bob 71 python torch pytorch

我无法理解PyTorch 文档中的示例如何对应于解释:

返回一个新的张量,其尺寸为 1,插入到指定位置。[...]

>>> x = torch.tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
tensor([[ 1,  2,  3,  4]])
>>> torch.unsqueeze(x, 1)
tensor([[ 1],
        [ 2],
        [ 3],
        [ 4]])
Run Code Online (Sandbox Code Playgroud)

nor*_*ok2 65

如果您查看前后数组的形状,您会看到之前(4,)和之后(1, 4)(当第二个参数为 时0)和(4, 1)(当第二个参数为 时1)。因此,根据第二个参数的值,将a1插入到轴0或处的数组形状中1

这与np.squeeze()删除大小轴1(单例)的(从 MATLAB 借用的命名法)相反。

  • 实际上,我因误解输出格式而经历了一段时间的困惑 (4认同)

小智 29

它指示添加尺寸的位置。torch.unsqueeze为张量增加一个额外的维度。

所以假设你有一个形状为 (3) 的张量,如果你在 0 位置添加一个维度,它将是形状 (1,3),这意味着 1 行和 3 列:

  • 如果你有一个形状为 (2,2) 的二维张量,在0位置添加一个额外的维度,这将导致张量的形状为 (1,2,2),这意味着一个通道、2 行和 2列。如果在 1 位置添加,它将是 (2,1,2) 形状,因此它将有 2 个通道,1 行和 2 列。
  • 如果在1位置添加,它将是 (3,1),这意味着 3 行和 1 列。
  • 如果将其添加到2位置,则张量的形状为 (2,2,1),这意味着 2 个通道、2 行和 1 列。


pro*_*sti 26

我不知道为什么这里没有提到 PyTorch 引用,因为这是 PyTorch 的遗产。

torch.squeeze(input, dim=None, *, out=None)? 张量

返回一个张量,其中删除input了大小为1 的所有维度。

例如,如果输入的形状为:(A×1×B×C×1×D),则输出张量的形状为:(A×B×C×D)。

dim给定时,挤压操作只在给定的维度上进行。如果输入的形状为: (A×1×B) ,squeeze(input, 0)则保持张量不变,但squeeze(input, 1)会将张量压缩为形状 (A×B) 。

torch.unsqueeze(input, dim)? 张量

返回一个新的张量,其尺寸为 1,插入到指定位置。

返回的张量与此张量共享相同的基础数据。

dim的范围内的值[-input.dim() - 1, input.dim() + 1)可以被使用。负dim将对应于unsqueeze()应用在dim = dim + input.dim() + 1


uke*_*emi 16

unsqueeze将 nd 张量转换为 (n+1).d。一种方法是添加一个深度为 1 的额外维度。然而,由于新维度应该跨越哪个轴(即它应该在哪个方向“未压缩”)是不明确的,这需要由dim参数指定。

例如unsqueeze可以通过三种不同的方式应用于二维张量:

在此处输入图片说明

生成的未压缩张量具有相同的信息,但用于访问它们的索引不同。

  • 我会给亮点赏金。谢谢。 (12认同)

小智 8

unsqueeze是一种改变张量维度的方法,使得张量乘法等操作成为可能。这基本上改变了维度以产生具有不同维度的张量。

例如:如果你想将大小为 (4) 的张量与大小为(4, N, N)的张量相乘,那么你会得到一个错误。但是使用 unsqueeze 方法,您可以将张量转换为大小(4,1,1)。现在,由于它的操作数大小为 1,因此您将能够将两个张量相乘。