在Torch中,view()和unsqueeze()有什么区别?

27

使用unsqueeze()函数的方法:

input = torch.Tensor(2, 4, 3) # input: 2 x 4 x 3
print(input.unsqueeze(0).size()) # prints - torch.size([1, 2, 4, 3])

使用view()方法:

input = torch.Tensor(2, 4, 3) # input: 2 x 4 x 3
print(input.view(1, -1, -1, -1).size()) # prints - torch.size([1, 2, 4, 3])
根据文档,unsqueeze()可以在给定参数位置插入单例维度,而view()可以创建一个与tensor关联的不同维度的视图。 我对view()的作用很清楚,但我无法将其与unsqueeze()区分开来。此外,我不明白何时使用view()和何时使用unsqueeze()? 欢迎任何良好解释的帮助!

https://discuss.pytorch.org/t/what-is-the-difference-between-view-and-unsqueeze/1155/11?u=iacob - iacob
2个回答

27

view()函数只能接收一个-1参数。

所以,如果想要添加一个单例维度,需要提供所有的维度作为参数。例如,如果A是一个2x3x4的张量,则需要执行A:view(2, 1, 3, 4)来添加一个单例维度。

然而,在有些情况下,当操作被使用时,输入的维度是未知的。因此,我们不知道A是2x3x4,但仍希望插入一个单例维度。在使用张量的小批量时经常会出现这种情况,其中最后一个维度通常是未知的。在这些情况下,可以使用nn.Unsqueeze函数,它可以让我们在编写代码时不需要显式地了解其他维度即可插入维度。


8
用unsqueeze()和view()插入一个单例维度,在性能方面有区别吗? - Tom
2
为什么不直接执行 A.view(A.shape[0], 1, A.shape[1], A.shape[2]) 呢? - Ritwik
2
@Ritwik因为那太麻烦了。unsqueeze是专门为该操作设计的简写形式。 - iacob
@Ritwik,有一些简单的方法,比如A.view(*A.shape, 1, 1)A.view(1, *A.shape, 1),但不适用于你的情况(在中间添加额外维度)。 - Mert

1

unsqueeze()view()的一个特殊情况

为了方便,许多Python库都有常用更通用函数的简称。

  • view()将张量重塑为指定形状
  • unsqueeze()通过添加深度为1的新维度来重新塑造张量
    (即将n.d张量转换为n+1.d张量)

何时使用unsqueeze()

一些示例用途:

  • 您设计了一个模型以接受RGB图像张量(3d:CxHxW),但您的数据是2d灰度图像(HxW
  • 您的模型被设计为输入批处理数据(batch_size x dim1 x dim2 x ...),而您想要提供单个样本(即大小为1的批次)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接